作家
登录

Java多线程之synchronized关键字详解

作者: 来源: 2017-05-29 14:39:09 阅读 我要评论

  • class Thread1 extends Thread 
  •     private Example example; 
  •  
  •     public Thread1(Example example) 
  •  
  •     { 
  •         this.example = example; 
  •     } 
  •  
  •     @Override 
  •     public void run() 
  •     { 
  •         Example.execute(); 
  •     } 
  •  
  •  
  • class Thread2 extends Thread 
  •     private Example example; 
  •  
  •     public Thread2(Example example) 
  •     { 
  •         this.example = example; 
  •     } 
  •  
  •     @Override 
  •     public void run() 
  •     { 
  •         Example.execute2(); 
  •     } 
  •  
  • 所以如不雅是静态办法的情况(execute()和execute2()都加上static关键字),即就是向两个线程传入不合的Example对象,这两个线程仍然是互相制约的,必须先履行完一个,再履行下一?。

    专门解决这一问题。

    结论:

    如不雅某个synchronized办法是static的,那么当线查拜访该办法时,它锁的并不是synchronized办法地点的对象,而是synchronized办法地点的类所对应的Class对象。Java中,无论一个类有若干个对象,这些对象会对应独一一个Class对象,是以当线程分别拜访同一个类的两个对象的两个static,synchronized办法时,它们的履行次序也是次序的,也就是说一个线程先去履行办法,履行完毕后另一个线程才开端。

    4. synchronized块

    synchronized块写法:

    synchronized(object)

    {

    }

    表示线程在履行的时刻会将object对象上锁。(留意这个对象可所以随便率性类的对象,也可以应用this关键字)。

    例子法度榜样4所达到的效不雅和例子法度榜样2的效不雅一样,都是使得两个线程的履行次序进行,而不是并发进行,当一个线程履行时,将object对象锁住,另一个线程就不克不及履行对应的块。

    synchronized办法实际上等同于用一个synchronized块包住办法中的所有语句,然后在synchronized块的括号中传入this关键字。当然,如不雅是静态办法,须要锁定的则是class对象。

    可能一个办法中只有几行代码会涉及到线程同步问题,所以synchronized块比synchronized办法加倍细粒度地控制了多个线程的拜访,只有synchronized块中的内容不克不及同时被多个线程所拜访,办法中的其他语句仍然可以同时被多个线程所拜访(包含synchronized块之前的和之后的)。

    留意:被synchronized保护的数据应当是私有的。

    应用synchronized关键字解决线程的同步问题会带来一些履行效力汕9依υ?题。

    3.推敲静态的同步办法

    结论:

    synchronized办法是一种粗粒度的并发控制,某一时刻,只能有一个线程履行该synchronized办法;

    synchronized块则是一种细粒度的并发控制,只会将块中的代码同步,位于办法内、synchronized块之外的其他代码是可以被多个线程同时拜访到的。

    JDK 5.0的并发包

    JDK1.4及之前是无法避免这些问题的。

    JDK 5.0惹人了如许一个包:java.util.concurrent:

    http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-frame.html

    限于篇幅,这里不再介绍。

    【编辑推荐】

    1. Java反射机制应用实践
    2. Java Spring中同时拜访多种不合数据库
    3. JavaScript 中的 this 周全解析
    4. Javascript深拷贝
    5. Java高等特点之反射进修总结
    【义务编辑:枯木 TEL:(010)68476606】

      推荐阅读

      PHP与Golang如何通信?

    惯例的筹划: 用Golang写一个http/TCP办事,php经由过程http/TCP与Golang通信 将Golang经由较多封装,做为php扩大。 PHP经由过程体系敕令,调取Golang的可履行文件存在的问题: >>>详细阅读


    本文标题:Java多线程之synchronized关键字详解

    地址:http://www.17bianji.com/lsqh/35484.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)