пятница, 26 июня 2015 г.

Сказка о том как в JVM каждый обьект имеет свой собственнный монитор

По этому нам не нужно создавать самим мьютекс и с помощью его безопасить обьект разделяемый между потоками.

У меня был вопрос о том, что если мы обьект передаем в синхронизированный блок одного треда, и там внутри он начинает "ожидать", как другие треды к нему обратятся,  если они должны "проинформировать" - но все просто - когда на мониторе вызывается "ждать", блокировка синхронизированного блока отпускается; блокировка также отпускается, когда тред начинает "спать".

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  +"]";
  }
}





Комментариев нет:

Отправить комментарий