本文已参与「新人创作礼」活动,一起开启掘金创作之路。
变量共享是进行线程间通信的常用手段之一,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:
开发成长之旅 [持续更新中...]
上篇导航:23:volatile关键字:变量可见性与禁止重排序 - 掘金 (juejin.cn)
下篇导航:25:线程间通信协作-Exchanger - 掘金 (juejin.cn)
欢迎关注...