上一篇 <<<CAS无锁模式及ABA问题
下一篇 >>>Lock锁
Synchronized的作用
- (1)原子性:确保线程互斥的访问同步代码
- (2)可见性:保证共享变量的修改能够及时可见---unlock之前必须同步到主内存,lock操作会从主内存中加载
- (3)有序性:有效解决重排序问题。
- (4)可重入性:最大的作用是避免死锁
Synchronized的实现方式
- A、方法锁
- B、方法块锁---粒度更细,更加灵活
注意在使用锁的时候,必须要使用同一把锁,要不然会失效。
Synchronized的实现原理
1.方法锁
public synchronized void method() {
System.out.println("Hello World!");
}
public static synchronized void method() {
System.out.println("Hello World!");
}
2.方法块锁
private void b() {
synchronized (lockObject) {
System.out.println("我是B");
}
}
监视器官方解释
1.monitorenter获得锁
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.monitorenter
- a、如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者;
- b、如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1;
- c、如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权;
2.monitorexit释放锁
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.monitorexit
- a、monitorexit指令执行时,monitor的进入数减1
- b、如果减1后进入数为0,那线程退出monitor,不再是这个monitor的所有者。
- c、其他被这个monitor阻塞的线程可以尝试去获取这个 monitor 的所有权。
虚拟机源码分析
http://hg.openjdk.java.net/jdk8 下载hotspot虚拟机
监视器Monitor有两种同步方式:互斥与协作。
协作:一个线程向缓冲区写数据,另一个线程从缓冲区读数据,如果读线程发现缓冲区为空就会等待,当写线程向缓冲区写入数据,就会唤醒读线程。
相关文章链接:
<<<多线程基础
<<<线程安全与解决方案
<<<锁的深入化
<<<锁的优化
<<<Java内存模型(JMM)
<<<Volatile解决JMM的可见性问题
<<<Volatile的伪共享和重排序
<<<CAS无锁模式及ABA问题
<<<Lock锁
<<<AQS同步器
<<<Condition
<<<CountDownLatch同步计数器
<<<Semaphore信号量
<<<CyclicBarrier屏障
<<<线程池
<<<并发队列
<<<Callable与Future模式
<<<Fork/Join框架
<<<Threadlocal
<<<Disruptor框架
<<<如何优化多线程总结