问答

为什么这里的number不用volatile也能保证可见性

作者:admin 2021-10-04 我要评论

class ShareData { private int number=0; private Lock lock=new ReentrantLock(); private Condition condition=lock.newCondition(); public void sub() { lo...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
class ShareData {
    private int number=0;
    private Lock lock=new ReentrantLock();
    private Condition condition=lock.newCondition();

    public void sub() {
        lock.lock();
            try {
                while(number==0){
                    condition.await();
                }
                number--;
                System.out.println(Thread.currentThread().getName()+"\t"+number);
                condition.signal();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
    }
    public void add(){
        lock.lock();
        try {
            while(number!=0){
                condition.await();
            }
            number++;
            System.out.println(Thread.currentThread().getName()+"\t"+number);
            condition.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}
/**
 * 初始值为零的变量,两个线程对其交替操作,一个加1,一个减一,来5轮
 */
public class ProdConsumer_TraditionDemo {
    public static void main(String[] args) {
        ShareData shareData = new ShareData();
        new Thread(()->{
            for (int i = 0; i < 5; i++) {
                shareData.add();
            }
        },"A").start();
        new Thread(()->{
            for (int i = 0; i < 5; i++) {
                shareData.sub();
            }
        },"B").start();
    }

}
###

因为有锁 (lock.lock()

###

换而言之,就是因为有锁读到的数据一定是最新的,同步方法压栈,操作数栈中的值肯定是最新的。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 为什么这里的number不用volatile也能保

    为什么这里的number不用volatile也能保

  • 既然Java开源,为什么没有产生其他分支

    既然Java开源,为什么没有产生其他分支

  • 怎么优雅的提取字符串中的汉语金钱信息

    怎么优雅的提取字符串中的汉语金钱信息

  • 写好的小程序组件(发布到了npm)怎么

    写好的小程序组件(发布到了npm)怎么

腾讯云代理商
海外云服务器