Java的synchronized关键字

Java的synchronized关键字

ID:37710707

大小:36.50 KB

页数:3页

时间:2019-05-29

Java的synchronized关键字_第1页
Java的synchronized关键字_第2页
Java的synchronized关键字_第3页
资源描述:

《Java的synchronized关键字》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、·Java的synchronized关键字:同步机制总结JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程式。不久前用到了同步,现在回过头来对JAVA中的同步做个总结,以对前段时间工作的总结和自我技术的条理话。JAVA的synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。假如再细的分类,synchronized可作用于instance变量、objectre

2、ference(对象引用)、static函数和classliterals(类名称字面常量)身上。在进一步阐述之前,我们需要明确几点:A.无论synchronized关键字加在方法上还是对象上,他取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。B.每个对象只有一个锁(lock)和之相关联。C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。接着来讨论synchronized用到不同地方对代码产生的影响:假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法

3、,P1、P2就都能够调用他们。Java的synchronized使用方法总结1. 把synchronized当作函数修饰符时,示例代码如下:1.Public synchronized void method(){  2.//….  3.}  这也就是同步方法,那这时synchronized锁定的是哪个对象呢?他锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,他们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却能够任意调用这个被加了synchronized关键字的方法。上边的示例代码等同于

4、如下代码:4.public void method()  5.{  6.synchronized (this)      //  (1)  7.{  1.       //…..  2.}  3.}  (1)处的this指的是什么呢?他指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于objectreference。――那个拿到了P1对象锁的线程,才能够调用P1的同步方法,而对P2而言,P1这个锁和他毫不相干,程式也可能在这种情形下摆脱同步机制的控制,造成数据混乱。2.同步块,示例代码如下:4.public void met

5、hod(SomeObject so) {  5.synchronized(so)  6.{  7.       //…..  8.}  9.}  这时,锁就是so这个对象,谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:10.class Foo implements Runnable  11.{  12.       private byte[] lock = new byte[0];  // 特别的ins

6、tance变量  13.    Public void method()  14.{  15.       synchronized(lock) { //… }  16.}  17.//…..  18.}  注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Objectlock=newObject()则需要7行操作码。3.将synchronized作用于static函数,示例代码如下:19.Class Foo  20.{  21.public synchronized static vo

7、id method1()   // 同步的static 函数  22.{  1.//….  2.}  3.public void method2()  4.{  5.       synchronized(Foo.class)   //  class literal(类名称字面常量)  6.}  7.       }  代码中的method2()方法是把classliteral作为锁的情况,他和同步的static函数产生的效果是相同的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。记得在《Effe

8、ctiveJava》一书中看到过将Fo

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。