Discuss / Java / volatile 和 synchronized

volatile 和 synchronized

Topic source

🌙

#1 Created at ... [Delete] [Delete and Lock User]

我觉得2刚刚好相反

volatile 保证每个线程读取的数据 最新值 

synchronized 是为了保证 数据安全 每次都要拿到 初始值

class Counter {

    public static final Object lock = new Object();

    public static volatile int count = 0;

}

只加 volatile 不加 鎖 并不能实现线程安全

Alber

#2 Created at ... [Delete] [Delete and Lock User]

可能导致线程安全的问题:原子性问题、有序性问题、可见性问题

JAVA构建内存模型JMM来应对,其中volatile解决可见性+有序性问题,原子性问题解决思路本质是互斥,只能使用锁来解决,比如synchronized或者CAS

保持热爱

#3 Created at ... [Delete] [Delete and Lock User]

volatile只保证每个线程读到的数据是最新值,但不能保证多个线程对同一个变量的操作的原子的,
synchronized并不涉及数据的初始值,它只保证同步代码块内的代码同一时刻只能有一个线程访问

保持热爱

#4 Created at ... [Delete] [Delete and Lock User]

例如以下代码,结果可能是0,1,2之中的任意一个

Thread A = new Thread(() -> {
    Counter.count++;});
Thread B = new Thread(() -> {
    Counter.count++;});
A.start();
B.start();
System.out.println(Counter.count);

  • 1

Reply