首页常见问题正文

synchronized和volatile的区别是什么?

更新时间:2023-05-18 来源:黑马程序员 浏览量:

IT培训班

  synchronized和volatile都可以用于多线程编程,但它们的作用不同。

  volatile变量用于保证线程之间对变量的可见性,即当一个线程修改了一个volatile变量时,其他线程能够立即看到这个变量的最新值。volatile关键字通常用于修饰被多个线程访问的共享变量,防止出现线程之间的数据不一致问题。

  synchronized则是用于实现线程间的互斥同步,即同一时间只允许一个线程访问某个代码块或方法。通过 synchronized关键字的作用,可以保证在同一时刻只有一个线程执行被锁定的代码块或方法,从而避免出现多个线程同时修改共享变量造成的数据不一致问题。

  下面是一个简单的代码演示:

public class SynchronizedVsVolatileDemo {
    private volatile int volatileCounter = 0;
    private int synchronizedCounter = 0;

    public void incrementVolatileCounter() {
        volatileCounter++;
    }

    public synchronized void incrementSynchronizedCounter() {
        synchronizedCounter++;
    }

    public int getVolatileCounter() {
        return volatileCounter;
    }

    public int getSynchronizedCounter() {
        return synchronizedCounter;
    }
}

  在上面的代码中,我们定义了两个计数器变量 volatileCounter 和 synchronizedCounter,分别用 volatile 和 synchronized 进行修饰。incrementVolatileCounter 方法使用 volatile 关键字对 volatileCounter 进行递增操作,incrementSynchronizedCounter 方法使用 synchronized 关键字对 synchronizedCounter 进行递增操作。getVolatileCounter 和 getSynchronizedCounter 方法分别用于获取这两个计数器的值。

  在多线程环境下,如果我们同时启动多个线程去调用这两个递增方法,可以观察到下面的现象:

  ·对于volatileCounter变量,由于它被volatile修饰,因此在递增操作后,其他线程能够立即看到这个变量的最新值,从而保证了数据的可见性。

  ·对于synchronizedCounter变量,由于它被synchronized修饰,因此在递增操作时,只有一个线程能够获取到锁并执行递增操作,其他线程需要等待锁被释放后才能执行递增操作,从而保证了线程间的互斥同步。

  综上所述,volatile和synchronized在多线程编程中有着不同的作用,需要根据实际需求选择使用。

分享到:
在线咨询 我要报名
和我们在线交谈!