-
synchronized是可重入的
-
JDK早期的 重量级 - OS
后来的改进
锁升级的概念:
我就是厕所所长 (一 二) -
sync (Object)
markword 记录这个线程ID (偏向锁)
如果线程争用:升级为 自旋锁
10次以后,升级为重量级锁 - OS -
场景选择
执行时间短(加锁代码),线程数少,用自旋
执行时间长,线程数多,用系统锁 -
volatile并不能保证多个线程共同修改变量时所带来的不一致问题,也就是说volatile不能替代synchronized
运行下面的程序,并分析结果
public class T04_VolatileNotSync {
volatile int count = 0;
// synchronized void m() { // 加上synchronized,问题解决
void m() {
for (int i = 0; i < 10000; i++) count++;
}
public static void main(String[] args) {
T04_VolatileNotSync t = new T04_VolatileNotSync();
List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < 10; i++) {
threads.add(new Thread(t::m, "thread-" + i));
}
threads.forEach((o) -> o.start());
threads.forEach((o) -> {
try {
o.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println(t.count);
}
}
网友评论