java多线程同步,Volatile详解

BSO 2020-11-02 15:43:10 java常见问答 6000

java中的基础知识是很多的,而且内容也是十分的详细的。今天就来为大家介绍一下java多线程同步的有关内容,一起来了解一下吧。

Volatile详解

a.volatile关键字为域变量的访问提供了一种免锁机制

b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新

c.因此每次使用该域就要重新计算,而不是使用寄存器中的值

d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量

代码如下所示:

public class Bank
{
    private volatile int count = 0; // 账户余额
    // 存钱
    public void addMoney(int money)
    {
        count += money;
        System.out.println(System.currentTimeMillis() + "存进:" + money);
    }
    // 取钱
    public void subMoney(int money)
    {
        if (count - money < 0)
        {
            System.out.println("余额不足");
            return;
        }
        count -= money;
        System.out.println(System.currentTimeMillis() + "取出:" + money);
    }
    // 查询
    public void lookMoney()
    {
        System.out.println("账户余额:" + count);
    }
}

运行结果如下图:

java多线程同步

因为volatile不能保证原子操作导致的,因此volatile不能代替synchronized。此外volatile会组织编译器对代码优化。它的原理是每次要线程要访问volatile修饰的变量时都是从内存中读取,而不是存缓存当中读取,因此每个线程访问到的变量值都是一样的。这样就保证了同步。

以上就是关于java多线程同步,Volatile详解的主要内容了。具体的知识还是很好理解的。如果你对java知识感兴趣,想要了解更多java基础知识,敬请关注奇Q工具网。

推荐阅读:

java多线程同步方法,同步代码块,实例展示

java多线程编程书哪本比较好?

java多线程编程详解