<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java_Tutorial%2FThread%2Fsynchronized</id>
		<title>Java Tutorial/Thread/synchronized - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java_Tutorial%2FThread%2Fsynchronized"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Thread/synchronized&amp;action=history"/>
		<updated>2026-04-21T22:46:36Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java_Tutorial/Thread/synchronized&amp;diff=2751&amp;oldid=prev</id>
		<title> в 17:44, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Thread/synchronized&amp;diff=2751&amp;oldid=prev"/>
				<updated>2010-05-31T17:44:26Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 17:44, 31 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java_Tutorial/Thread/synchronized&amp;diff=2752&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java_Tutorial/Thread/synchronized&amp;diff=2752&amp;oldid=prev"/>
				<updated>2010-05-31T15:17:57Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==  A synchronized collection with Collections.synchronizedCollection ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.Collection;&lt;br /&gt;
import java.util.Collections;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
import java.util.TreeSet;&lt;br /&gt;
class MyThread implements Runnable {&lt;br /&gt;
  Thread t;&lt;br /&gt;
  Collection&amp;lt;String&amp;gt; col;&lt;br /&gt;
  MyThread(Collection&amp;lt;String&amp;gt; c) {&lt;br /&gt;
    col = c;&lt;br /&gt;
    t = new Thread(this, &amp;quot;MyThread&amp;quot;);&lt;br /&gt;
    t.start();&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    try {&lt;br /&gt;
      Thread.sleep(100);&lt;br /&gt;
      col.add(&amp;quot;D&amp;quot;);&lt;br /&gt;
      synchronized (col) {&lt;br /&gt;
        for (String str : col) {&lt;br /&gt;
          System.out.println(&amp;quot;MyThread: &amp;quot; + str);&lt;br /&gt;
          Thread.sleep(50);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } catch (Exception exc) {&lt;br /&gt;
      exc.printStackTrace();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class Main {&lt;br /&gt;
  public static void main(String args[]) throws Exception {&lt;br /&gt;
    Set&amp;lt;String&amp;gt; tsStr = new TreeSet&amp;lt;String&amp;gt;();&lt;br /&gt;
    Collection&amp;lt;String&amp;gt; syncCol = Collections.synchronizedCollection(tsStr);&lt;br /&gt;
    syncCol.add(&amp;quot;A&amp;quot;);&lt;br /&gt;
    syncCol.add(&amp;quot;B&amp;quot;);&lt;br /&gt;
    syncCol.add(&amp;quot;C&amp;quot;);&lt;br /&gt;
    new MyThread(syncCol);&lt;br /&gt;
    synchronized (syncCol) {&lt;br /&gt;
      for (String str : syncCol) {&lt;br /&gt;
        System.out.println(&amp;quot;Main thread: &amp;quot; + str);&lt;br /&gt;
        Thread.sleep(500);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  creating a piped communications system between two threads. ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.PipedReader;&lt;br /&gt;
import java.io.PipedWriter;&lt;br /&gt;
public class MainClass extends Thread {&lt;br /&gt;
  public static void main(String[] args) throws IOException {&lt;br /&gt;
    PipedWriter pw = new PipedWriter();&lt;br /&gt;
    PipedReader pr = new PipedReader(pw);&lt;br /&gt;
    int ch;&lt;br /&gt;
    try {&lt;br /&gt;
      for (int i = 0; i &amp;lt; 15; i++)&lt;br /&gt;
        pw.write(&amp;quot; A&amp;quot; + i + &amp;quot;\n&amp;quot;);&lt;br /&gt;
      while ((ch = pr.read()) != -1)&lt;br /&gt;
        System.out.print((char) ch);&lt;br /&gt;
    } catch (IOException e) {&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Determining If the Current Thread Is Holding a Synchronized Lock ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Main {&lt;br /&gt;
  public static void main(String[] argv) throws Exception {&lt;br /&gt;
    Object o = new Object();&lt;br /&gt;
    System.out.println(Thread.holdsLock(o));&lt;br /&gt;
    synchronized (o) {&lt;br /&gt;
      System.out.println(Thread.holdsLock(o));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Flag Communication ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class FlagComm {&lt;br /&gt;
  public static void main(String args[]) {&lt;br /&gt;
    FlagSend s = new FlagSend();&lt;br /&gt;
    FlagRec r = new FlagRec(s);&lt;br /&gt;
    Thread st = new Thread(s);&lt;br /&gt;
    Thread rt = new Thread(r);&lt;br /&gt;
    rt.setDaemon(true); &lt;br /&gt;
    st.start();&lt;br /&gt;
    rt.start();&lt;br /&gt;
    try {&lt;br /&gt;
      while (s.isValid) { &lt;br /&gt;
        Thread.sleep(100);&lt;br /&gt;
      }&lt;br /&gt;
    } catch (InterruptedException e) {&lt;br /&gt;
      e.printStackTrace();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class FlagSend implements Runnable {&lt;br /&gt;
  volatile int theValue;&lt;br /&gt;
  volatile boolean isValid;&lt;br /&gt;
  public void run() {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
      while (isValid) {&lt;br /&gt;
        Thread.yield();&lt;br /&gt;
      }&lt;br /&gt;
      theValue = (int) (Math.random() * 256);&lt;br /&gt;
      System.out.println(&amp;quot;sending &amp;quot; + theValue);&lt;br /&gt;
      isValid = true;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class FlagRec implements Runnable {&lt;br /&gt;
  FlagSend theSender;&lt;br /&gt;
  public FlagRec(FlagSend sender) {&lt;br /&gt;
    theSender = sender;&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
      while (!theSender.isValid) {&lt;br /&gt;
        Thread.yield();&lt;br /&gt;
      }&lt;br /&gt;
      System.out.println(&amp;quot;received &amp;quot; + theSender.theValue);&lt;br /&gt;
      theSender.isValid = false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  guarantee that threads are woken in the same order in which they waited ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
public class Wake {&lt;br /&gt;
  private Vector&amp;lt;Object&amp;gt; stopped = new Vector&amp;lt;Object&amp;gt;();&lt;br /&gt;
  public void stopOne() {&lt;br /&gt;
    Object myLock = new Object();&lt;br /&gt;
    synchronized (myLock) {&lt;br /&gt;
      stopped.addElement(myLock);&lt;br /&gt;
      try {&lt;br /&gt;
        myLock.wait();&lt;br /&gt;
      } catch (InterruptedException e) {&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void wakeOne() {&lt;br /&gt;
    Object theLock = null;&lt;br /&gt;
    synchronized (stopped) {&lt;br /&gt;
      if (stopped.size() != 0) {&lt;br /&gt;
        theLock = stopped.firstElement();&lt;br /&gt;
        stopped.removeElementAt(0);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (theLock != null) {&lt;br /&gt;
      synchronized (theLock) {&lt;br /&gt;
        theLock.notify();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String args[]) {&lt;br /&gt;
    Wake queue = new Wake();&lt;br /&gt;
    Runnable r = new RunThis(queue);&lt;br /&gt;
    Thread t;&lt;br /&gt;
    for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
      t = new Thread(r);&lt;br /&gt;
      t.start();&lt;br /&gt;
    }&lt;br /&gt;
    for (int i = 0; i &amp;lt; 11; i++) {&lt;br /&gt;
      try {&lt;br /&gt;
        Thread.sleep((long) (Math.random() * 1000));&lt;br /&gt;
      } catch (InterruptedException e) {&lt;br /&gt;
      }&lt;br /&gt;
      System.out.println(&amp;quot;About to wake one thread&amp;quot;);&lt;br /&gt;
      queue.wakeOne();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class RunThis implements Runnable {&lt;br /&gt;
  Wake w;&lt;br /&gt;
  public RunThis(Wake w) {&lt;br /&gt;
    this.w = w;&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    System.out.println(&amp;quot;Thread starting, name is &amp;quot; + Thread.currentThread().getName());&lt;br /&gt;
    w.stopOne();&lt;br /&gt;
    System.out.println(&amp;quot;Thread woken up, name is &amp;quot; + Thread.currentThread().getName());&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Handle concurrent read/write: use synchronized to lock the data ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.Iterator;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
public class Main {&lt;br /&gt;
  public static void main(String[] args) throws Exception {&lt;br /&gt;
    Vector data = new Vector();&lt;br /&gt;
    new Producer(data).start();&lt;br /&gt;
    new Consumer(data).start();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Producer extends Thread {&lt;br /&gt;
  Vector data;&lt;br /&gt;
  Producer(Vector data) {&lt;br /&gt;
    super(&amp;quot;Producer&amp;quot;);&lt;br /&gt;
    this.data = data;&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
      data.addElement(new Object());&lt;br /&gt;
      if (data.size() &amp;gt; 1000)&lt;br /&gt;
        data.removeAllElements();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Consumer extends Thread {&lt;br /&gt;
  Vector data;&lt;br /&gt;
  Consumer(Vector data) {&lt;br /&gt;
    super(&amp;quot;Consumer&amp;quot;);&lt;br /&gt;
    this.data = data;&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
      synchronized (data) {&lt;br /&gt;
        Iterator it = data.iterator();&lt;br /&gt;
        while (it.hasNext())&lt;br /&gt;
          it.next();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Test Synchronized method ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class TestSynchronized {&lt;br /&gt;
  int taskID;&lt;br /&gt;
  public synchronized void performATask(int val) {&lt;br /&gt;
    taskID = val;&lt;br /&gt;
    print(&amp;quot;before: &amp;quot; + taskID);&lt;br /&gt;
    try {&lt;br /&gt;
      Thread.sleep(4000);&lt;br /&gt;
    } catch (InterruptedException x) {&lt;br /&gt;
    }&lt;br /&gt;
    print(&amp;quot;after: &amp;quot; + taskID);&lt;br /&gt;
  }&lt;br /&gt;
  public static void print(String msg) {&lt;br /&gt;
    System.out.println(Thread.currentThread().getName() + &amp;quot;: &amp;quot; + msg);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) throws Exception{&lt;br /&gt;
    final TestSynchronized tus = new TestSynchronized();&lt;br /&gt;
    Runnable runA = new Runnable() {&lt;br /&gt;
      public void run() {&lt;br /&gt;
        tus.performATask(1);&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
    Thread ta = new Thread(runA, &amp;quot;threadA&amp;quot;);&lt;br /&gt;
    ta.start();&lt;br /&gt;
    Thread.sleep(2000);&lt;br /&gt;
    Runnable runB = new Runnable() {&lt;br /&gt;
      public void run() {&lt;br /&gt;
        tus.performATask(2);&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
    Thread tb = new Thread(runB, &amp;quot;threadB&amp;quot;);&lt;br /&gt;
    tb.start();&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Test Unsynchronized method ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class TestUnsynchronized {&lt;br /&gt;
  int taskID;&lt;br /&gt;
  public void doAction(int val) {&lt;br /&gt;
    print(&amp;quot;entering doAction()&amp;quot;);&lt;br /&gt;
    taskID = val;&lt;br /&gt;
    print(&amp;quot;doAction() taskID &amp;quot; + taskID);&lt;br /&gt;
    try {&lt;br /&gt;
      Thread.sleep(4000);&lt;br /&gt;
    } catch (InterruptedException x) {&lt;br /&gt;
    }&lt;br /&gt;
    print(&amp;quot;doAction() sleep after taskID &amp;quot; + taskID);&lt;br /&gt;
    print(&amp;quot;leaving performATask()&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  public static void print(String msg) {&lt;br /&gt;
    String threadName = Thread.currentThread().getName();&lt;br /&gt;
    System.out.println(threadName + &amp;quot;: &amp;quot; + msg);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) throws Exception {&lt;br /&gt;
    final TestUnsynchronized tus = new TestUnsynchronized();&lt;br /&gt;
    Runnable runA = new Runnable() {&lt;br /&gt;
      public void run() {&lt;br /&gt;
        tus.doAction(3);&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
    Thread ta = new Thread(runA, &amp;quot;threadA&amp;quot;);&lt;br /&gt;
    ta.start();&lt;br /&gt;
    Thread.sleep(2000);&lt;br /&gt;
    Runnable runB = new Runnable() {&lt;br /&gt;
      public void run() {&lt;br /&gt;
        tus.doAction(7);&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
    Thread tb = new Thread(runB, &amp;quot;threadB&amp;quot;);&lt;br /&gt;
    tb.start();&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  This program is not synchronized. ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Callme {&lt;br /&gt;
  void call(String msg) {&lt;br /&gt;
    System.out.print(&amp;quot;[&amp;quot; + msg);&lt;br /&gt;
    try {&lt;br /&gt;
      Thread.sleep(1000);&lt;br /&gt;
    } catch (InterruptedException e) {&lt;br /&gt;
      System.out.println(&amp;quot;Interrupted&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    System.out.println(&amp;quot;]&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Caller implements Runnable {&lt;br /&gt;
  String msg;&lt;br /&gt;
  Callme target;&lt;br /&gt;
  Thread t;&lt;br /&gt;
  public Caller(Callme targ, String s) {&lt;br /&gt;
    target = targ;&lt;br /&gt;
    msg = s;&lt;br /&gt;
    t = new Thread(this);&lt;br /&gt;
    t.start();&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    target.call(msg);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Synch {&lt;br /&gt;
  public static void main(String args[]) {&lt;br /&gt;
    Callme target = new Callme();&lt;br /&gt;
    Caller ob1 = new Caller(target, &amp;quot;Hello&amp;quot;);&lt;br /&gt;
    Caller ob2 = new Caller(target, &amp;quot;Synchronized&amp;quot;);&lt;br /&gt;
    Caller ob3 = new Caller(target, &amp;quot;World&amp;quot;);&lt;br /&gt;
    try {&lt;br /&gt;
      ob1.t.join();&lt;br /&gt;
      ob2.t.join();&lt;br /&gt;
      ob3.t.join();&lt;br /&gt;
    } catch (InterruptedException e) {&lt;br /&gt;
      System.out.println(&amp;quot;Interrupted&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  This program uses a synchronized block. ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Callme {&lt;br /&gt;
  void call(String msg) {&lt;br /&gt;
    System.out.print(&amp;quot;[&amp;quot; + msg);&lt;br /&gt;
    try {&lt;br /&gt;
      Thread.sleep(1000);&lt;br /&gt;
    } catch (InterruptedException e) {&lt;br /&gt;
      System.out.println(&amp;quot;Interrupted&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    System.out.println(&amp;quot;]&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Caller implements Runnable {&lt;br /&gt;
  String msg;&lt;br /&gt;
  Callme target;&lt;br /&gt;
  Thread t;&lt;br /&gt;
  public Caller(Callme targ, String s) {&lt;br /&gt;
    target = targ;&lt;br /&gt;
    msg = s;&lt;br /&gt;
    t = new Thread(this);&lt;br /&gt;
    t.start();&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    synchronized (target) { // synchronized block&lt;br /&gt;
      target.call(msg);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class Synch1 {&lt;br /&gt;
  public static void main(String args[]) {&lt;br /&gt;
    Callme target = new Callme();&lt;br /&gt;
    Caller ob1 = new Caller(target, &amp;quot;Hello&amp;quot;);&lt;br /&gt;
    Caller ob2 = new Caller(target, &amp;quot;Synchronized&amp;quot;);&lt;br /&gt;
    Caller ob3 = new Caller(target, &amp;quot;World&amp;quot;);&lt;br /&gt;
    try {&lt;br /&gt;
      ob1.t.join();&lt;br /&gt;
      ob2.t.join();&lt;br /&gt;
      ob3.t.join();&lt;br /&gt;
    } catch (InterruptedException e) {&lt;br /&gt;
      System.out.println(&amp;quot;Interrupted&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  wait() and notify() must only be issued inside a synchronized block ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class WaitComm {&lt;br /&gt;
  public static void main(String args[]) {&lt;br /&gt;
    WFlagSend s = new WFlagSend();&lt;br /&gt;
    WFlagRec r = new WFlagRec(s);&lt;br /&gt;
    Thread st = new Thread(s);&lt;br /&gt;
    Thread rt = new Thread(r);&lt;br /&gt;
    rt.setDaemon(true); &lt;br /&gt;
    st.start();&lt;br /&gt;
    rt.start();&lt;br /&gt;
    try {&lt;br /&gt;
      st.join(); &lt;br /&gt;
      while (s.isValid) { &lt;br /&gt;
        Thread.sleep(100);&lt;br /&gt;
      }&lt;br /&gt;
    } catch (InterruptedException e) {&lt;br /&gt;
      e.printStackTrace();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class WFlagSend implements Runnable {&lt;br /&gt;
  volatile int theValue;&lt;br /&gt;
  boolean isValid;&lt;br /&gt;
  public void run() {&lt;br /&gt;
    for (int i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
      synchronized (this) {&lt;br /&gt;
        while (isValid) {&lt;br /&gt;
          try {&lt;br /&gt;
            this.wait();&lt;br /&gt;
          } catch (InterruptedException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      theValue = (int) (Math.random() * 256);&lt;br /&gt;
      System.out.println(&amp;quot;sending &amp;quot; + theValue);&lt;br /&gt;
      synchronized (this) {&lt;br /&gt;
        isValid = true;&lt;br /&gt;
        this.notify();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class WFlagRec implements Runnable {&lt;br /&gt;
  WFlagSend theSender;&lt;br /&gt;
  public WFlagRec(WFlagSend sender) {&lt;br /&gt;
    theSender = sender;&lt;br /&gt;
  }&lt;br /&gt;
  public void run() {&lt;br /&gt;
    while (true) {&lt;br /&gt;
      synchronized (theSender) {&lt;br /&gt;
        while (!theSender.isValid) {&lt;br /&gt;
          try {&lt;br /&gt;
            theSender.wait();&lt;br /&gt;
          } catch (InterruptedException e) {&lt;br /&gt;
            e.printStackTrace();&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      System.out.println(&amp;quot;received &amp;quot; + theSender.theValue);&lt;br /&gt;
      synchronized (theSender) {&lt;br /&gt;
        theSender.isValid = false;&lt;br /&gt;
        theSender.notify();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==  Waiting on an object ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Main {&lt;br /&gt;
  public static void main(String str[]) {&lt;br /&gt;
    final Object monitor = new Object();&lt;br /&gt;
    new Thread() {&lt;br /&gt;
      public void run() {&lt;br /&gt;
        try {&lt;br /&gt;
          synchronized (monitor) {&lt;br /&gt;
            System.out.println(&amp;quot;10 seconds ...&amp;quot;);&lt;br /&gt;
            monitor.wait(10000);&lt;br /&gt;
            System.out.println(&amp;quot;Wait over&amp;quot;);&lt;br /&gt;
          }&lt;br /&gt;
        } catch (Throwable t) {&lt;br /&gt;
          t.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }.start(); &lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>