理解synchronized

  • 实例同步方法
  • 静态同步方法
  • 实例同步方法块
  • 静态同步方法快
  • 每一个类都对应一个Class对象,这个Class对象只有一个锁,因此可将该锁视作是类锁。
  • 每一个类可以被实例化成无数个对象,而每一个对象只有一个锁。
  • 对于多个线程,同时访问一个类的类成员变量,或者访问一个对象的成员变量,就会造成线程安全问题。对于这些共享的数据会造成读取不一致的问题。
synchronized_structure.png

共享实例对象


多个线程共享同一个实例对象,那么对于实例对象的实例变量就会造成线程安全的问题。在共享对象的方法中,如果有访问到共享的这些实例变量,则需要通过实例对象唯一的锁来达到互斥。因此有两种方法可以达到目的,1、在调用的实例方法上上锁。2、加入同步块。

synchronized_instance.png
  • 通过在实例方法上上锁,表明只要拥有当前所在的实例对象的锁,才可以访问该方法。因为锁只有一把,因此保证同一个时刻只有一个线程访问同步的实例方法。
    public/private/protected synchronized void methodName(){ //操作 }
  • 通过同步块达到互斥的目的,多个线程驱动同步快所在的方法执行时,如果同步块是使得某个共享的实例对象的实例成员变量达到互斥,则线程进入同步块必须拥有这个实例对象的锁才行,因此保证同一个时刻只能有一个线程进入该同步块。
    synchronized(共享对象){ //操作 }

共享Class对象


synchronized_static.png
  • 通过在静态方法上上锁,表明只有当前类对应的Class对象的锁,才可以访问该静态方法。因为一个Class对象只有一把锁,因此可以保证同一个时刻只能有用一个线程进入该静态方法。
    public/private/protected synchronized static void methodName(){ //操作 }
  • 使用同步块。多个线程驱动同步块所在的方法时,如果同步块的目的是为了使得共享的某个类的类变量互斥,则线程进入到同步块必须拥有这个类的锁才行,从而保证同一个时刻只能有同一个线程进入该同步块。
    synchronized(共享类.class){ //操作 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,744评论 0 11
  • 原创文章&经验总结&从校招到A厂一路阳光一路沧桑 详情请戳www.codercc.com[http://www.c...
    你听___阅读 163,671评论 21 254
  • 前言:虽然自己平时都在用多线程,也能完成基本的工作需求,但总觉得,还是对线程没有一个系统的概念,所以,查阅了一些资...
    justCode_阅读 730评论 0 9
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,382评论 11 349
  • 《祸国》文笔精湛、意境开阔,实乃一篇佳作。其间交织着爱情与利益,政治与阴谋,让读者大呼过瘾的同时也留下深刻反思。 ...
    一掬温凉任平生阅读 2,430评论 1 4