您的位置:首页 > 健康 > 养生 > 深入学习Java `synchronized` 关键字

深入学习Java `synchronized` 关键字

2024/10/5 14:42:01 来源:https://blog.csdn.net/kaka_buka/article/details/139699988  浏览:    关键词:深入学习Java `synchronized` 关键字

深入学习Java synchronized 关键字

synchronized关键字通过确保在同一时间只有一个线程可以执行某个代码块,从而防止多个线程同时访问共享资源时发生数据不一致的问题。

修饰方法

synchronized用于修饰实例方法时,表示当前实例对象是同步锁。这意味着同一个实例的其他synchronized方法在同一时间只能被一个线程访问。

当多个线程访问同一个实例对象的synchronized方法时,只有一个线程可以执行该方法,其余线程必须等待。

public class SynchronizedExample {public synchronized void syncMethod() {System.out.println("Thread " + Thread.currentThread().getName() + " is executing.");try {Thread.sleep(1000); // 模拟操作耗时} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread " + Thread.currentThread().getName() + " finished.");}
}

修饰静态方法

synchronized用于修饰静态方法时,表示当前类对象是同步锁。这意味着同一个类的其他synchronized静态方法在同一时间只能被一个线程访问。

静态方法同步是针对类对象的同步,即使是不同实例调用,也会同步。

public class SynchronizedStaticExample {public static synchronized void syncStaticMethod() {System.out.println("Thread " + Thread.currentThread().getName() + " is executing static method.");try {Thread.sleep(1000); // 模拟操作耗时} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread " + Thread.currentThread().getName() + " finished static method.");}
}

修饰代码块

synchronized代码块可以指定任意对象作为同步锁。它提供了更细粒度的控制,可以仅对需要同步的代码进行同步,而不是整个方法。

代码块同步提供了更灵活的控制,可以对特定对象进行同步。

public class SynchronizedBlockExample {private final Object lock = new Object();public void syncBlock() {synchronized (lock) {System.out.println("Thread " + Thread.currentThread().getName() + " is executing block.");try {Thread.sleep(1000); // 模拟操作耗时} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread " + Thread.currentThread().getName() + " finished block.");}}
}

注意事项

  1. 避免过度同步:过度使用synchronized会导致线程竞争加剧,从而降低程序性能。应尽量减少同步代码的范围,仅对必要的部分进行同步。

  2. 死锁:不当的同步使用会导致死锁现象,例如两个线程互相等待对方释放锁。避免死锁的方法包括按顺序获取锁、使用超时机制等。

  3. 可见性问题:尽管synchronized可以确保代码块内的操作是原子的,但并不能解决所有的可见性问题。在某些情况下,可能需要使用volatile关键字或java.util.concurrent包中的其他同步机制来确保变量的可见性。

参考链接

  • Java Synchronized: https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com