synchronized保证原子性和可见性,通过锁对象的monitor实现,同一时刻仅一个线程可执行同步代码块;volatile仅保证可见性,禁止指令重排序,适用于状态标志等场景。两者性能与适用场景不同,需根据需求选择。此外,Java还提供Lock、原子类、并发集合等更灵活的同步机制。

synchronized 和 volatile,这两个 Java 关键字,就像武林中的两门绝学,虽然都能提升多线程环境下的数据安全,但修炼心法和适用场景却大相径庭。简单来说,
synchronized
volatile
synchronized 和 volatile 的区别
synchronized
synchronized
synchronized
而
synchronized
举个例子,假设我们有一个计数器类:
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}在这个例子中,
increment()
getCount()
synchronized
increment()
Counter
increment()
getCount()
count
但是,
synchronized
synchronized
volatile
但需要注意的是,
volatile
volatile
例如:
public class VolatileCounter {
private volatile int count = 0;
public void increment() {
count++; // 这是一个复合操作,不是原子性的
}
public int getCount() {
return count;
}
}在这个例子中,
count
volatile
volatile
count
increment()
count++
count
count
count
如果多个线程同时执行
increment()
count
count
count
count
count
count
最终,
count
那么,
volatile
volatile
public class Worker {
private volatile boolean running = true;
public void start() {
new Thread(() -> {
while (running) {
// 执行一些任务
}
System.out.println("Worker stopped.");
}).start();
}
public void stop() {
running = false;
}
}在这个例子中,
running
volatile
stop()
running
false
running
volatile
这其实是一个权衡的问题。
synchronized
AtomicInteger
volatile
volatile
synchronized
volatile
总的来说,
synchronized
volatile
Java 并发编程的世界远不止
synchronized
volatile
Lock
synchronized
ReentrantLock
ReadWriteLock
Lock
try...finally
java.util.concurrent.atomic
AtomicInteger
AtomicLong
AtomicReference
synchronized
java.util.concurrent
ConcurrentHashMap
CopyOnWriteArrayList
选择哪种同步机制,取决于具体的并发场景和性能要求。没有银弹,只有最适合的工具。理解每种工具的优缺点,才能在并发编程的世界里游刃有余。
以上就是synchronized 和 volatile 的区别是什么?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号