如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
java多线程同步块实例讲解素材java多线程同步块实例讲解素材Java同步块(synchronizedblock)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容:Java同步关键字(synchronzied)实例方法同步静态方法同步实例方法中同步块静态方法中同步块Java同步示例Java同步关键字(synchronized)Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出。有四种不同的同步块:实例方法静态方法实例方法中的同步块静态方法中的同步块上述同步块都同步在不同对象上。实际需要那种同步块视具体情况而定。实例方法同步下面是一个同步的实例方法:publicsynchronizedvoidadd(intvalue){this.count+=value;}静态方法同步静态方法同步和实例方法同步方法一样,也使用synchronized关键字。Java静态方法同步如下示例:publicstaticsynchronizedvoidadd(intvalue){count+=value;}同样,这里synchronized关键字告诉Java这个方法是同步的。静态方法的同步是指同步在该方法所在的类对象上。因为在Java虚拟机中一个类只能对应一个类对象,所以同时只允许一个线程执行同一个类中的静态同步方法。对于不同类中的静态同步方法,一个线程可以执行每个类中的静态同步方法而无需等待。不管类中的'那个静态同步方法被调用,一个类只能由一个线程同时执行。实例方法中的同步块有时你不需要同步整个方法,而是同步方法中的一部分。Java可以对方法的一部分进行同步。在非同步的Java方法中的同步块的例子如下所示:publicvoidadd(intvalue){synchronized(this){this.count+=value;}}示例使用Java同步块构造器来标记一块代码是同步的。该代码在执行时和同步方法一样。注意Java同步块构造器用括号将对象括起来。在上例中,使用了“this”,即为调用add方法的实例本身。在同步构造器中用括号括起来的对象叫做监视器对象。上述代码使用监视器对象同步,同步实例方法使用调用方法本身的实例作为监视器对象。一次只有一个线程能够在同步于同一个监视器对象的Java方法内执行。下面两个例子都同步他们所调用的实例对象上,因此他们在同步的执行效果上是等效的。publicclassMyClass{publicsynchronizedvoidlog1(Stringmsg1,Stringmsg2){log.writeln(msg1);log.writeln(msg2);}publicvoidlog2(Stringmsg1,Stringmsg2){synchronized(this){log.writeln(msg1);log.writeln(msg2);}}}在上例中,每次只有一个线程能够在两个同步块中任意一个方法内执行。如果第二个同步块不是同步在this实例对象上,那么两个方法可以被线程同时执行。静态方法中的同步块和上面类似,下面是两个静态方法同步的例子。这些方法同步在该方法所属的类对象上。publicclassMyClass{publicstaticsynchronizedvoidlog1(Stringmsg1,Stringmsg2){log.writeln(msg1);log.writeln(msg2);}publicstaticvoidlog2(Stringmsg1,Stringmsg2){synchronized(MyClass.class){log.writeln(msg1);log.writeln(msg2);}}}这两个方法不允许同时被线程访问。如果第二个同步块不是同步在MyClass.class这个对象上。那么这两个方法可以同时被线程访问。Java同步实例在下面例子中,启动了两个线程,都调用Counter类同一个实例的add方法。因为同步在该方法所属的实例上,所以同时只能有一个线程访问该方法。publicclassCounter{longcount=0;publicsynchronizedvoidadd(longvalue){this.count+=value;}}publicclassCounterThreadextendsThread{protectedCountercounter=null;publicCounterThread(Countercounter){this.counter=counter;}publicv