概念
synchronized 是 Java 中的关键字,是利用锁的机制来实现同步的。
锁机制有如下两种特性:
-
互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问。互斥性我们也往往称为操作的原子性。
-
可见性:必须确保在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的(即在获得锁时应获得最新共享变量的值),否则另一个线程可能是在本地缓存的某个副本上继续操作从而引起不一致。
public class Sync1 implements Runnable {
private int count = 10;
private Object o = new Object();
@Override
public void run() {
//锁定某个对象,拿到锁才可以执行下面代码
synchronized (o) {
count--;
System.out.println(Thread.currentThread().getName() + "count = " + count);
}
}
public static void main(String[] args) {
Sync1 sync1 = new Sync1();
for (int i = 0; i < 10; i++) {
new Thread(sync1, "Thread" + i).start();
}
}
}
Synchronized锁升级
在没有实际竞争的情况下,在Mark Word中CAS记录owner,形成偏向锁
如果有线程争用的情况下,会升级为自旋锁,在自旋的同时重新竞争锁。
在经历了一定次数的自旋后(默认为10次),升级为重量级锁,这种同步方式的成本非常高,包括系统调用引起的内核态与用户态切换、线程阻塞造成的线程切换等。
网友评论