欢迎来到天天文库
浏览记录
ID:37711320
大小:22.04 KB
页数:7页
时间:2019-05-29
《Java同步块synchronized block使用详解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java同步块(synchronizedblock)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容:·Java同步关键字(synchronzied)·实例方法同步·静态方法同步·实例方法中同步块·静态方法中同步块·Java同步示例Java 同步关键字(synchronized)Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中
2、的线程退出。有四种不同的同步块:1.实例方法2.静态方法3.实例方法中的同步块4.静态方法中的同步块上述同步块都同步在不同对象上。实际需要那种同步块视具体情况而定。实例方法同步下面是一个同步的实例方法:publicsynchronizedvoidadd(intvalue){this.count+=value;}注意在方法声明中同步(synchronized )关键字。这告诉Java该方法是同步的。Java实例方法同步是同步在拥有该方法的对象上。这样,每个实例其方法同步都同步在不同的对象上,即该方法所属的实例。只有
3、一个线程能够在实例方法同步块中运行。如果有多个实例存在,那么一个线程一次可以在一个实例同步块中执行操作。一个实例一个线程。静态方法同步静态方法同步和实例方法同步方法一样,也使用synchronized 关键字。Java静态方法同步如下示例:publicstaticsynchronizedvoidadd(intvalue){count+=value;}同样,这里synchronized 关键字告诉Java这个方法是同步的。静态方法的同步是指同步在该方法所在的类对象上。因为在Java虚拟机中一个类只能对应一个类对象,
4、所以同时只允许一个线程执行同一个类中的静态同步方法。对于不同类中的静态同步方法,一个线程可以执行每个类中的静态同步方法而无需等待。不管类中的那个静态同步方法被调用,一个类只能由一个线程同时执行。实例方法中的同步块有时你不需要同步整个方法,而是同步方法中的一部分。Java可以对方法的一部分进行同步。在非同步的Java方法中的同步块的例子如下所示:publicvoidadd(intvalue){synchronized(this){this.count+=value;}}示例使用Java同步块构造器来标记一块代码是同
5、步的。该代码在执行时和同步方法一样。注意Java同步块构造器用括号将对象括起来。在上例中,使用了“this”,即为调用add方法的实例本身。在同步构造器中用括号括起来的对象叫做监视器对象。上述代码使用监视器对象同步,同步实例方法使用调用方法本身的实例作为监视器对象。一次只有一个线程能够在同步于同一个监视器对象的Java方法内执行。下面两个例子都同步他们所调用的实例对象上,因此他们在同步的执行效果上是等效的。publicclassMyClass{publicsynchronizedvoidlog1(Stringms
6、g1,Stringmsg2){log.writeln(msg1);log.writeln(msg2);}publicvoidlog2(Stringmsg1,Stringmsg2){synchronized(this){log.writeln(msg1);log.writeln(msg2);}}}在上例中,每次只有一个线程能够在两个同步块中任意一个方法内执行。如果第二个同步块不是同步在this实例对象上,那么两个方法可以被线程同时执行。静态方法中的同步块和上面类似,下面是两个静态方法同步的例子。这些方法同步在该方法
7、所属的类对象上。publicclassMyClass{publicstaticsynchronizedvoidlog1www.baiyuewang.net(Stringmsg1,Stringmsg2){log.writeln(msg1);log.writeln(msg2);}publicstaticvoidlog2(Stringmsg1,Stringmsg2){synchronized(MyClass.class){log.writeln(msg1);log.writeln(msg2);}}}这两个方法不允许同时
8、被线程访问。如果第二个同步块不是同步在MyClass.class这个对象上。那么这两个方法可以同时被线程访问。Java同步实例在下面例子中,启动了两个线程,都调用Counter类同一个实例的add方法。因为同步在该方法所属的实例上,所以同时只能有一个线程访问该方法。publicclassCounter{longcount=0;publicsynchronizedvoida
此文档下载收益归作者所有