网站开发服务属于什么行业,先做网站再备案吗,深圳保障性住房规划,看视频做那个网站好Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容#xff1a;Java同步关键字(synchronzied)实例方法同步静态方法同步实例方法中同步块静态方法中同步块Java同步示例Java同步关键字(synchronized)Java中的同步块用s…Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容Java同步关键字(synchronzied)实例方法同步静态方法同步实例方法中同步块静态方法中同步块Java同步示例Java同步关键字(synchronized)Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞直到执行该同步块中的线程退出。有四种不同的同步块实例方法静态方法实例方法中的同步块静态方法中的同步块上述同步块都同步在不同对象上。实际需要那种同步块视具体情况而定。实例方法同步下面是一个同步的实例方法1 public synchronized void add(intvalue){2 this.count value;3 }注意在方法声明中同步(synchronized )关键字。这告诉Java该方法是同步的。Java实例方法同步是同步在拥有该方法的对象上。这样每个实例其方法同步都同步在不同的对象上即该方法所属的实例。只有一个线程能够在实例方法同步块中运行。如果有多个实例存在那么一个线程一次可以在一个实例同步块中执行操作。一个实例一个线程。静态方法同步静态方法同步和实例方法同步方法一样也使用synchronized 关键字。Java静态方法同步如下示例1 public static synchronized void add(intvalue){2 count value;3 }同样这里synchronized 关键字告诉Java这个方法是同步的。静态方法的同步是指同步在该方法所在的类对象上。因为在Java虚拟机中一个类只能对应一个类对象所以同时只允许一个线程执行同一个类中的静态同步方法。对于不同类中的静态同步方法一个线程可以执行每个类中的静态同步方法而无需等待。不管类中的那个静态同步方法被调用一个类只能由一个线程同时执行。实例方法中的同步块有时你不需要同步整个方法而是同步方法中的一部分。Java可以对方法的一部分进行同步。在非同步的Java方法中的同步块的例子如下所示1 public void add(intvalue){23 synchronized(this){4 this.count value;5 }6 }示例使用Java同步块构造器来标记一块代码是同步的。该代码在执行时和同步方法一样。注意Java同步块构造器用括号将对象括起来。在上例中使用了“this”即为调用add方法的实例本身。在同步构造器中用括号括起来的对象叫做监视器对象。上述代码使用监视器对象同步同步实例方法使用调用方法本身的实例作为监视器对象。一次只有一个线程能够在同步于同一个监视器对象的Java方法内执行。下面两个例子都同步他们所调用的实例对象上因此他们在同步的执行效果上是等效的。1 public classMyClass {23 public synchronized voidlog1(String msg1, String msg2){4 log.writeln(msg1);5 log.writeln(msg2);6 }78 public voidlog2(String msg1, String msg2){9 synchronized(this){10 log.writeln(msg1);11 log.writeln(msg2);12 }13 }14 }在上例中每次只有一个线程能够在两个同步块中任意一个方法内执行。如果第二个同步块不是同步在this实例对象上那么两个方法可以被线程同时执行。静态方法中的同步块和上面类似下面是两个静态方法同步的例子。这些方法同步在该方法所属的类对象上。1 public classMyClass {2 public static synchronized voidlog1(String msg1, String msg2){3 log.writeln(msg1);4 log.writeln(msg2);5 }67 public static voidlog2(String msg1, String msg2){8 synchronized(MyClass.class){9 log.writeln(msg1);10 log.writeln(msg2);11 }12 }13 }这两个方法不允许同时被线程访问。如果第二个同步块不是同步在MyClass.class这个对象上。那么这两个方法可以同时被线程访问。Java同步实例在下面例子中启动了两个线程都调用Counter类同一个实例的add方法。因为同步在该方法所属的实例上所以同时只能有一个线程访问该方法。1 public classCounter{2 long count 0;3 public synchronized void add(longvalue){4 this.count value;5 }6 }78 public class CounterThread extendsThread{9 protected Counter counter null;1011 publicCounterThread(Counter counter){12 this.counter counter;13 }1415 public voidrun() {16 for(int i0; i10; i){17 counter.add(i);18 }19 }20 }2122 public classExample {2324 public static voidmain(String[] args){25 Counter counter newCounter();26 Thread threadA newCounterThread(counter);27 Thread threadB newCounterThread(counter);2829 threadA.start();30 threadB.start();31 }32 }创建了两个线程。他们的构造器引用同一个Counter实例。Counter.add方法是同步在实例上是因为add方法是实例方法并且被标记上synchronized关键字。因此每次只允许一个线程调用该方法。另外一个线程必须要等到第一个线程退出add()方法时才能继续执行方法。如果两个线程引用了两个不同的Counter实例那么他们可以同时调用add()方法。这些方法调用了不同的对象因此这些方法也就同步在不同的对象上。这些方法调用将不会被阻塞。如下面这个例子所示1 public classExample {23 public static voidmain(String[] args){4 Counter counterA newCounter();5 Counter counterB newCounter();6 Thread threadA newCounterThread(counterA);7 Thread threadB newCounterThread(counterB);89 threadA.start();10 threadB.start();11 }12 }注意这两个线程threadA和threadB不再引用同一个counter实例。CounterA和counterB的add方法同步在他们所属的对象上。调用counterA的add方法将不会阻塞调用counterB的add方法。