【JAVA核心知识】17.1:线程间变量共享

本文探讨了Java中变量共享的实现方式,如通过继承Runnable、共享成员变量和final修饰,以及如何利用synchronized保证线程间的原子性。同时介绍了JMM解决可见性和有序性的概念。实例演示了如何在Runnable中操作共享数据并结合线程池启动。
摘要由CSDN通过智能技术生成

变量共享是进行线程间通信的常用手段之一,java的内存模型(JMM)解决了可见性和有序性,我们则可以通过线程锁保证原子性。


有变量:

class ShareData {
    int num = 0;
    
    public synchronized void inrc() {
        num++;
    }
    
    public synchronized void desc() {
        num--;
    }
}

常用的变量共享手段有:

继承Runnable将变量作为成员变量

public static void main(String[] args) {
        ShareData shareData = new ShareData();
        InrcRunnable incrRun = new InrcRunnable(shareData);
        DescRunnable descRun = new DescRunnable(shareData);
        new Thread(incrRun).start();
        new Thread(descRun).start();
}
class InrcRunnable implements Runnable {
    ShareData shareData;
    
    public InrcRunnable(ShareData shareData) {
        this.shareData = shareData;
    }
    
    @Override
    public void run() {
        shareData.inrc();
    }
}
class DescRunnable implements Runnable {
    ShareData shareData;
    
    public DescRunnable(ShareData shareData) {
        this.shareData = shareData;
    }
    
    @Override
    public void run() {
        shareData.desc();
    }
}

将变量定义为final直接访问

public static void main(String[] args) {
    final ShareData shareData = new ShareData();
    new Thread(new Runnable() {
        @Override
        public void run() {
            shareData.inrc();
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            shareData.desc();
        }
    }).start();
}

jdk1.8不再需要添加final修饰符,这是因为该版本的jdk会隐式的为这些变量添加final修饰词。

PS:
【JAVA核心知识】系列导航 [持续更新中…]
上篇导航:16:volatile关键字:变量可见性与禁止重排序
下篇导航:17.2:线程间通信Exchanger
欢迎关注…

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yue_hu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值