学习笔记之synchronized

发布时间 2023-09-13 23:30:52作者: 程序侠

学习笔记之synchronized

ynchronized是一个JDK提供的同步的关键字,通过synchronized可以锁定一个代码块或者一个方法,从而实现锁的效果。

synchronized的几种用法

1.修饰在对象方法上

public class SynDemo {
  int i = 0;
  int x = 0;
  public synchronized void testSync() {
    i++;
    x++;
  }
  }

放在方法上,锁的是SynDemo的实例对象。这里要弄清楚实例对象,简单的来说就是假如A和B是SynDemo的实例对象,那么A和B对不同的实例对象,所以A和B不形成互异关系。

2.在静态方法上:

public class SynDemo {
  static int value = 0;
  public synchronized static void testStaticSync() {
    value++;
  }
}

修饰在静态方法上的时候,锁的是这个类对应的类对象,也就是SyncDemo.class对象。再举个例子,假如A和B是SynDemo的实例对象,此时A和B形成互异关系。

3.在方法内部的同步代码快#

public class SynDemo {
  int i = 0;
  int x = 0;
  Object lockObj = new Object();
  public void testInnerSync() {
    synchronized(lockObj) {
      i++;
      x++;
    }
  }
}

使用synchronized关键字需要注意什么

其实synchronized是对一个对象上锁的,使用的时候需要注意在对同一个对象上锁才能达到互斥的目的。

(1)定义一个TestThread类,继承自Thread

(2)TestThread的内部持有一个SycDemo对象

(3)TestThread的run方法内部调用SyncDemo对象的testSync方法执行synchronized修饰的同步方法。

public class SynDemo {
    int i = 0;
    int x = 0;     // 争抢对象SyncDemo的锁
    public synchronized void  testSync() {
        i++;
        x++;
    }
 
    static class TestThread extends Thread {
        SynDemo lock;
        TestThread(SynDemo lock) {
            this.lock = lock;
        }
        @Override
        public void run() {
            lock.testSync();
        }
    }

    public static void main(String[] args) {          // 锁对象lock1
        SynDemo lock1 = new SynDemo();          // 锁对象lock2
        SynDemo lock2 = new SynDemo();
        
        TestThread threadA = new TestThread(lock1);
        TestThread threadB = new TestThread(lock2);
        
        threadA.start();
        threadB.start();
    }
}

像这种方式,threadAthreadB是达不到互斥的目的的,因为threadA锁住的是lock1对象;然而thread锁住的是lock2对象。完全争抢的不是同一个锁。

参考文章:https://mp.weixin.qq.com/s/nATPDj4jH2HWxKair28_SQ