0
点赞
收藏
分享

微信扫一扫

并发编程-Synchronized锁

上一篇 <<<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框架
<<<如何优化多线程总结

举报

相关推荐

0 条评论