Q:synchronized 代码块内出现异常会释放锁吗?同步方法代码
A:会自动释放锁,查看字节码指令可以知道,monitorexit插入在方法竣事处(13行)和异常处(19行)。从Exception table异常表中也可以看出。
通俗的讲,方向锁就是在运行过程中,对象的锁方向某个线程。即在开启方向锁机制的环境下,某个线程获得锁,当该线程下次再想要获得锁时,不需要再获得锁(即忽略synchronized关键词),直接就可以实行同步代码,比较得当竞争较少的环境。为了解决这一问题,HotSpot的作者在Java SE 1.6 中对Synchronized进行了优化,引入了方向锁。当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储锁方向的线程ID,以后该线程在进入和退出同步块时不需要进行CAS操作来加锁息争锁。只需要简单的测试一下对象头的Mark Word里是否存储着指向当前线程的方向锁。如果乐成,表示线程已经获取到了锁。
ReentrantLock为常用类,它是一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。synchronized是通过软件(JVM)实现的,简单易用,纵然在JDK5之后有了Lock,仍然被广泛的使用。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |