并发安全的特性 – 原子性:锁
JDK为我们提供了两种我们比较常见的锁,分别是:
第一种,就是我们比较熟悉的synchronized: 依赖于JVM的关键字。
第二种,是Lock: 依赖特殊的CPU指令,代码实现,ReektrantLock。
原子性:synchronized
主要有以下几种使用方法:
一、修饰代码块
大括号括起来的代码,作用于调用的对象。指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。 和 synchronized 方法一样,synchronized(this)代码块也是锁定当前对象的。synchronized 关键字加到 static 静态方法和synchronized(class)代码块上都是是给 Class 类上锁。这里再提一下:synchronized关键字加到非 static 静态方法上是给对象实例上锁。另外需要注意的是:尽量不要使用 synchronized(String a) 因为JVM中,字符串常量池具有缓冲功能!
二、修饰实例方法
子类继承该方法时,不能继承synchronized关键字,作用在同一个对象。
private static Object obj = new Object();
//修饰一个代码块(作用在同一个对象)
public void test1(int j) {
synchronized (this) {
for (int i = 0; i < 100; i++) {
log.info("test1 {} - {}", j, i);
}
}
}
//修饰一个方法(子类继承该方法时,不能继承synchronized关键字)
//作用在同一个对象
public synchronized void test2(int j) {
for (