ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

同步方法与同步块那个是更好选择

2026/8/22 12:05:41 拓冰建站 浏览量
同步方法与同步块那个是更好选择 在java 开发中我们在使用synchronized关键字对同步数据进行加锁时有两种写法一是同步方法另一种时同步方法块。代码如下/** * author Evan Walker * version 1.0 * desc 昂炎数据 https://www.ayshuju.com/home * date 2023/03/23 22:22:50 */ public class SynchronizeDemo { Object lock new Object(); /** * 第一种锁住整个静态method 类锁同步方法 */ public static synchronized void synchronizedMethodA() { //业务代码 } /** * 第一种相当于用类对象锁住代码块 类锁同步代码块 */ public static void synchronizedBlockA() { synchronized (SynchronizeDemo.class) { //业务代码 } } /** * 第二种使用一个互斥对象锁住代码块它可以这么理解多个线程想访问互斥代码块必须拿到mutex对象的锁。 * 然后后面的所有类型都可以用第一种类型来解释同步代码块 */ public void synchronizedBlockB() { synchronized (lock) { // 业务代码 } } /** * 第三种锁住整个非静态method 同步方法 */ public synchronized void synchronizedMethodC() { //业务代码 } /** * 第三种相当于用this对象来锁住方法同步代码块 */ public void synchronizedBlockC() { synchronized (this) { //业务代码 } } }上述代码描述了几种同步方法和同步代码块的写法。同步方法与同步块的区别同步方法同步方法直接在方法上加 synchronized 实现加锁。同步方法块同步代码块则在方法内部加锁在起方法内部实现synchronized关键字。同步方法与同步块那个是更好的选择同步代码块是更好的选择因为它不会锁住整个对象当然你也可以让它锁住整个对象意味着同步块之外的代码是异步执行的效率会更高。同步方法会锁住整个对象哪怕这个类中有对各不相关联的同步块这通常会导致他们停止执行并需要等待获取这个对象上的锁。同步代码块更要符合开放调用原则只在需要锁住的代码块锁住相应的对象这样从侧面来说可以避免死锁。请知道这样一条原则同步的范围越小越好。但也有例外Java锁粗化虽说同步的范围越少越好但在 Java 虚拟机中存在着一种叫做锁粗化的优化方法这种方法是把同步范围变大。比方说 StringBuffer 它是一个线程安全的类自然最常用的 append() 方法是一个同步方法写代码的时会反复 append 字符串这意味着要进行反复的加锁 - 解锁这对性能不利这意味着 Java 虚拟机在这条线程上要反复地在内核态和用户态之间进行切换因此 Java 虚拟机会将多次 append 方法调用的代码进行一个锁粗化的操作将多次的 append 的操作扩展到 append 方法的头尾变成一个大的同步块这样就减少了加锁 -- 解锁的次数有效地提升了代码执行的效率。