理解synchronized

作者: _挑灯看剑_ | 来源:发表于2016-10-31 14:39 被阅读77次
  • 实例同步方法
  • 静态同步方法
  • 实例同步方法块
  • 静态同步方法快
  • 每一个类都对应一个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){ //操作 }

相关文章

网友评论

    本文标题:理解synchronized

    本文链接:https://www.haomeiwen.com/subject/hplputtx.html