并发synchronized详解 在 Java 中,synchronized 是一种非常重要的关键字,用于解决多线程编程中的线程安全问题。线程安全问题是指多个线程同时访问同一个共享、可变资源时可能出现的错误或不一致情况。为了解决这个问题,Java 提供了两种方式来实现同步互斥访问:synchronized 和 Lock。 synchronized 是一种内置锁,基于 JVM 内置锁实现,通过内部对象 Monitor(监视器锁)实现。Monitor 是一种对象锁,锁的是对象而非引用,作用粒度是对象,可以用来实现对临界资源的同步互斥访问。synchronized 有三种用法:同步实例方法、同步类方法和同步代码块。每个同步对象都有一个自己的 Monitor,与之关联,当且一个 Monitor 被持有后,它将处于锁定状态。 synchronized 的实现原理是基于进入和退出 Monitor 对象来实现方法同步和代码块同步。monitorenter 和 monitorexit 两条指令分别在同步块逻辑代码的起始位置与结束位置。monitorenter 指令尝试获取 Monitor 的所有权,如果 Monitor 的进入数为 0,则该线程进入 Monitor,然后将进入数设置为 1,该线程即为 Monitor 的所有者。如果线程已经占有该 Monitor,只是重新进入,则进入 Monitor 的进入数加 1。如果其他线程已经占用了 Monitor,则该线程进入阻塞状态,直到 Monitor 的进入数为 0,再重新尝试获取 Monitor 的所有权。 monitorexit 指令执行时,Monitor 的进入数减 1,如果减 1 后进入数为 0,那线程退出 Monitor,不再是这个 Monitor 的所有者。其他被这个 Monitor 阻塞的线程可以尝试去获取这个 Monitor 的所有权。 synchronized 的语义底层是通过一个 Monitor 对象来完成,wait/notify 等方法也依赖于 Monitor 对象。这就是为什么只有在同步的块或者方法中才能调用 wait/notify 等方法,否则会抛出 java.lang.IllegalMonitorStateException 异常的原因。 在 Java 1.5 之后版本中,JVM 内置锁做了重大的优化,如锁粗化、锁消除、轻量级锁、偏向锁、适应性自旋等技术来减少锁操作的开销,内置锁的并发性能已经基本与 Lock 持平。 synchronized 是一种非常重要的关键字,用于解决多线程编程中的线程安全问题。其实现原理是基于 Monitor 对象,通过 monitorenter 和 monitorexit 两条指令来实现方法同步和代码块同步。
- 粉丝: 0
- 资源: 20
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助