JAVA锁原理和选择synchronized & Lock

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zl_1079167478/article/details/83377664

废话不多说,进正题,参考一下synchronized 的实现原理

synchronized 的实现原理

JVM可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。当方法调用时,调用指令将会 检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持有monitor(虚拟机规范中用的是管程一词), 然后再执行方法,最后再方法完成(无论是正常完成还是非正常完成)时释放monitor。在方法执行期间,执行线程持有了monitor,其他任何线程都无法再获得同一个monitor。如果一个同步方法执行期间抛 出了异常,并且在方法内部无法处理此异常,那这个同步方法所持有的monitor将在异常抛到同步方法之外时自动释放。
说白了就是状态锁,JVM分配一个内存保存状态,此状态标识该方法是不是被synchronized 修饰,如果是那么执行这个方法的时候monitor+1,然后监视monitor,如果monitor!=-1 那么其他线程等待,方法执行完(正常或异常)JVM都会主动释放锁monitor-1,不需要我们瞎操心,LOCK和synchronized 的区别在此,LOCK需要我们手动释放锁,JVM的亲儿子是synchronized ,所以还是好好用synchronized 吧,不要跟JVM过不去。


好,看了上面的东西,如果自己实现锁的话,要怎么办呢,关注2点

  1. 状态----该资源是否被占用
  2. 释放锁—包括正常和异常情况

好,那我就靠这个做一个分布式锁试试,下篇讲解

猜你喜欢

转载自blog.csdn.net/zl_1079167478/article/details/83377664