synchronized关键字(三)

2020-03-14  本文已影响0人  AD刘涛

可重入原理(通过加锁计数器实现)

Java内存模型

java内存模型.png

两个线程之间如何通信呢?

每个线程本地都有一个共享变量的副本。因为线程对性能要求很高,所以每个线程都会拷贝一份主内存数据放入自己的本地内存。如果线程之间有数据更新时,则会将本线程的变更数据写入主内存,然后另外一个线程再次读取主内存的值。

可见性原理

synchronized关键字是如何实现可见性

这是因为被synchronized关键字所修饰的代码块在执行完毕后,被锁住的对象所做的任何修改,在线程释放之前,都要把线程内存的数据写入主内存。同时新的线程在进入synchronized代码块后也会到主内存读取最新的数据。

synchronized 的缺陷

  1. 效率低:锁的释放情况少;试图获得锁时不能设定超时;不能中断一个正在试图获得锁的线程
  2. 不够灵活(读写锁更灵活):加锁与释放锁的时机单一,每个锁仅有单一的条件(某个对象),可能是不够的。
  3. 无法知道是否成功的获取到锁

思考?

如何反编译字节码

  1. 我们首先编写Decompilation14.java文件。
  2. 其次在命令行输入javac Decompilation14.java将java文件编译成Decompilation14.class文件。
  3. 最后通过命令javap -verbose Decompilation14.class命令就能反编译出文件
上一篇下一篇

猜你喜欢

热点阅读