作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向:Vue、SpringBoot、微信小程序
本文讲解了 Java 中线程同步的语法和应用场景,并给出了样例代码。线程同步是一种机制,用于控制多个线程之间的访问顺序和共享资源的安全性。当多个线程并发地访问共享资源时,如果没有适当的同步机制,可能会导致数据不一致或出现竞态条件等问题。

线程同步是一种机制,用于控制多个线程之间的访问顺序和共享资源的安全性,当多个线程并发地访问共享资源时,如果没有适当的同步机制,可能会导致数据不一致或出现竞态条件等问题。
线程同步的目的是保证多个线程按照一定的顺序访问共享资源,避免数据错误和不确定性的出现,Java 提供了多种线程同步的机制,常用的有以下几种:
synchronized 关键字可以修饰方法或代码块,确保在同一时间只有一个线程可以访问被修饰的方法或代码块。通过获取内置锁(也称为监视器锁)来实现线程同步,保证了多个线程对共享资源的互斥访问。ReentrantLock 是 Java 提供的一个可重入锁(即允许同一线程多次获取锁),相比于 synchronized 关键字,ReentrantLock 提供了更多的灵活性和功能,例如可定时、可中断的获取锁、公平性等。volatile 关键字用于修饰共享变量,保证多个线程对该变量的可见性。被 volatile 修饰的变量在每次访问时都会从主内存中读取最新的值,而不使用线程的本地缓存,从而确保了多个线程之间的数据一致性。synchronized 关键字和 Lock 接口提供了条件变量(Condition),可以通过条件变量实现更细粒度的线程同步。条件变量可以让线程在某个条件满足时等待,或者唤醒其他线程。线程同步是保证多线程程序正确执行的重要手段,通过合理地使用线程同步机制,可以避免数据竞争和不一致的问题,保证程序的正确性和稳定性。

下面是一个使用 synchronized 关键字模拟线程同步的简单示例代码,请同学们复制到本地执行。
public class ThreadSyncExample {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized void decrement() {
count--;
}
public int getCount() {
return count;
}
}
public class Main {
public static void main(String[] args) {
ThreadSyncExample example = new ThreadSyncExample();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
example.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
example.decrement();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final Count: " + example.getCount());
}
}在这个例子中,ThreadSyncExample 类中的 increment() 和 decrement() 方法都使用了 synchronized 关键字修饰,确保在同一时间只有一个线程可以访问这些方法。因此,当两个线程分别调用 increment() 和 decrement() 方法时,会按照顺序依次执行,避免了对 count 变量的并发访问问题。
在 Main 类中,创建了两个线程 t1 和 t2 ,分别对 count 进行递增和递减操作。通过调用 t1.join() 和 t2.join(),确保在打印最终结果之前,等待 t1 和 t2 线程执行完毕。最终,打印出 count 的最终值。
通过使用
synchronized关键字进行线程同步,可以保证线程安全性,避免数据竞争和不一致的问题。

线程同步在 Java 中有许多应用场景,下面列举一些常见的应用场景,请同学们认真学习。
wait()、notify()、notifyAll())来实现线程之间的交互和协作。ConcurrentHashMap、CopyOnWriteArrayList 等,这些数据结构内部使用了线程同步机制来保证多线程环境下的数据一致性和安全性。线程同步在多线程编程中起着重要的作用,可以保证多个线程之间的协调和互斥,确保数据的正确性和一致性,在涉及到共享资源、数据交互、任务协作等场景下,合理地运用线程同步机制可以提高程序的并发性和稳定性。

synchronized 关键字和 ReentrantLock 类有什么区别?它们分别适用于什么场景?synchronized 关键字有哪些使用方式?synchronized 关键字和 volatile 关键字有什么区别?本文讲解了 Java 中线程同步的语法和应用场景,并给出了样例代码,在下一篇博客中,将讲解 Java 的线程死锁问题。