同步方法和同步块,哪个是更好的选择?
同步块,这意味着同步块之外的代码是异步执行的,这比同步整个方法更提升代码的效率。请 知道一条原则:同步的范围越小越好。
虽说同步的范围越少越好,但是在Java虚拟机中还是存在着一种叫做锁粗化的优化方法,这种 方法就是把同步范围变大。这是有用的,比方说StringBuffer,它是一个线程安全的类,自然 最常用的append()方法是一个同步方法,我们写代码的时候会反复append字符串,这意味着 要进行反复的加锁->解锁,这对性能不利,因为这意味着Java虚拟机在这条线程上要反复地在 内核态和用户态之间进行切换,因此Java虚拟机会将多次append方法调用的代码进行一个锁 粗化的操作,将多次的append的操作扩展到append方法的头尾,变成一个大的同步块,这样 就减少了加锁–>解锁的次数,有效地提升了代码执行的效率。