繁体   English   中英

了解Java中的同步

[英]understanding synchronized in java

为什么通常线程样本在同步块中放入这么多代码。 根据我的理解,在以下情况下,synchronized仅用于锁定b以便进行等待和通知:

主类ThreadA:

class ThreadA {
      public static void main(String [] args) {
         ThreadB b = new ThreadB();
         b.start();

         synchronized(b) {
            try {
               System.out.println("Waiting for b to complete...");

              b.wait();
           } catch (InterruptedException e) {}
           System.out.println("Total is: " + b.total);
           System.out.println(Thread.currentThread().getName());

        }
     }
  }

和ThreadB类:

class ThreadB extends Thread {   
     int total;     
     public void run() {
        synchronized(this) 
        {
           System.out.println();
           for(int i=0;i<100;i++) 
           {
               System.out.println(Thread.currentThread().getName());
              total += i;
           }
           notify();
        }
     }
  }

如果我只wait并在synchronized块中进行notify ,将会发生什么变化:

class ThreadA {
      public static void main(String [] args) {
         ThreadB b = new ThreadB();
         b.start();
            try {
               System.out.println("Waiting for b to complete...");

                synchronized(b) {   b.wait();}
           } catch (InterruptedException e) {}
           System.out.println("Total is: " + b.total);
           System.out.println(Thread.currentThread().getName());


     }
  }

根据我的理解,在以下情况下,同步仅用于锁定b以等待和通知

您的理解是错误的。

synchronized还用于:

  • 互斥,以确保一次只有一个线程执行由特定监视器“保护”的代码
  • 确保跨线程的内存访问正确(一个线程看到另一线程所做的更改)

如果我只等待并在同步块中进行通知,将会发生什么变化:

在这种特殊情况下,它会根据竞争条件而有所不同-在原始代码中,如果新thread在原始线程中到达同步块之前开始执行,则不会达到“等待b”完成”,直到第二个线程结束...这时它将永远处于wait

请注意,这是要等待一个非常糟糕的主意 Thread监控,如wait/notify是由内部使用Thread

总之,你使用的示例是一个坏的开始以各种方式-但同步用于不仅仅是wait/notify

请注意, total += i在Java中不是原子操作。 因此,您还必须同步此构造。

您也不必同步notify()和wait(),因为它们的锁是在内部处理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM