По этому нам не нужно создавать самим мьютекс и с помощью его безопасить обьект разделяемый между потоками.
У меня был вопрос о том, что если мы обьект передаем в синхронизированный блок одного треда, и там внутри он начинает "ожидать", как другие треды к нему обратятся, если они должны "проинформировать" - но все просто - когда на мониторе вызывается "ждать", блокировка синхронизированного блока отпускается; блокировка также отпускается, когда тред начинает "спать".
У меня был вопрос о том, что если мы обьект передаем в синхронизированный блок одного треда, и там внутри он начинает "ожидать", как другие треды к нему обратятся, если они должны "проинформировать" - но все просто - когда на мониторе вызывается "ждать", блокировка синхронизированного блока отпускается; блокировка также отпускается, когда тред начинает "спать".
package com.coreer.training;
/**
* Проверить как работает монитор лок, если один поток ожидает что-то от друго, но все еще в блоке сихнронизации
* по монитору
*/
public class App {
public static void main(String[] args) {
final MonitoredNewborn baby = new MonitoredNewborn();
new Thread(() -> {
try {
synchronized (baby) {
printFromThread(baby.toString());
baby.setName("Petya");
baby.notify();
baby.wait();
printFromThread(baby.toString());
baby.setExpectedAgeToMarry(35);
baby.notify();
baby.wait();
printFromThread(baby.toString());
baby.setExpectedHighSchoolName("Hight military school");
baby.notify();
baby.wait();
printFromThread(baby.toString());
baby.setExpectedProfession("lumberjack");
baby.notify();
baby.wait();
printFromThread(baby.toString());
baby.setExpectedHobby("Martial arts");
printFromThread(baby.toString());
baby.notify();
}
} catch (InterruptedException e) {
printFromThread("Who dared?");
}
}, "father").start();
new Thread(() -> {
try {
synchronized (baby) {
printFromThread(baby.toString());
baby.setName("Ienakantij");
baby.notify();
baby.wait();
printFromThread(baby.toString());
baby.setExpectedAgeToMarry(24);
baby.notify();
baby.wait();
printFromThread(baby.toString());
baby.setExpectedHighSchoolName("Harvard");
baby.notify();
baby.wait();
printFromThread(baby.toString());
baby.setExpectedProfession("Prime Minister");
baby.notify();
baby.wait();
printFromThread(baby.toString());
baby.setExpectedHobby("Dancing");
printFromThread(baby.toString());
baby.notify();
}
} catch (InterruptedException e) {
printFromThread("Who dared?");
}
}, "mather").start();
/*for(int i=0; i< 5; i++) {
try {
Thread.sleep(3000);
printFromThread("Let's notify all!!!");
baby.notifyAll();
} catch (InterruptedException | IllegalMonitorStateException e) {
printFromThread("Main thread was interapted!");
e.printStackTrace();
}
}*/
}
private static void printFromThread(String x) {
System.out.println("[ " + Thread.currentThread().getName() + " (" + System.nanoTime() + ") ]" + x);
}
}
package com.coreer.training;
/**
* Created by aieremenko on 6/26/15.
*/
public class MonitoredNewborn {
private String name;
private String expectedHighSchoolName;
private int expectedAgeToMarry;
private String expectedProfession;
private String expectedHobby;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getExpectedHighSchoolName() {
return expectedHighSchoolName;
}
public void setExpectedHighSchoolName(String expectedHighSchoolName) {
this.expectedHighSchoolName = expectedHighSchoolName;
}
public int getExpectedAgeToMarry() {
return expectedAgeToMarry;
}
public void setExpectedAgeToMarry(int expectedAgeToMarry) {
this.expectedAgeToMarry = expectedAgeToMarry;
}
public String getExpectedProfession() {
return expectedProfession;
}
public void setExpectedProfession(String expectedProfession) {
this.expectedProfession = expectedProfession;
}
public String getExpectedHobby() {
return expectedHobby;
}
public void setExpectedHobby(String expectedHobby) {
this.expectedHobby = expectedHobby;
}
@Override
public String toString() {
return "[" + name + ", " + expectedHighSchoolName + ", " + expectedAgeToMarry + ", " + expectedProfession + ", " + expectedHobby +"]";
}
}
Комментариев нет:
Отправить комментарий