可重入原理(通过加锁计数器实现)
-
JVM
负责跟踪对象被加锁的次数 - 线程第一次给对象加锁的时候,计数变为1。每当这个相同的线程在此对象上再次获得锁时,计数会递增。
- 每当任务离开时,计数递减,当计数为0的时候,锁被完全释放。
Java内存模型
java内存模型.png两个线程之间如何通信呢?
每个线程本地都有一个共享变量
的副本。因为线程对性能要求很高,所以每个线程都会拷贝一份主内存数据放入自己的本地内存。如果线程之间有数据更新时,则会将本线程的变更数据写入主内存,然后另外一个线程再次读取主内存的值。
可见性原理
synchronized
关键字是如何实现可见性
?
这是因为被synchronized
关键字所修饰的代码块在执行完毕后,被锁住的对象所做的任何修改,在线程释放之前,都要把线程内存的数据写入主内存。同时新的线程在进入synchronized
代码块后也会到主内存读取最新的数据。
synchronized
的缺陷
- 效率低:锁的释放情况少;试图获得锁时不能设定超时;不能中断一个正在试图获得锁的线程
- 不够灵活(读写锁更灵活):加锁与释放锁的时机单一,每个锁仅有单一的条件(某个对象),可能是不够的。
- 无法知道是否成功的获取到锁
思考?
-
synchronized
关键字有哪些注意点呢 ?锁对象不能为空,作用域不宜过大(也就是
synchronized
关键字所包裹的范围),避免死锁。 -
如何选择
Lock
和synchronized
关键字 ?
如何反编译字节码
- 我们首先编写
Decompilation14.java
文件。 - 其次在命令行输入
javac Decompilation14.java
将java文件编译成Decompilation14.class
文件。 - 最后通过命令
javap -verbose Decompilation14.class
命令就能反编译出文件
网友评论