Java多线程信息共享

-粗粒度:子线程与子线程之间、和main线程之间缺乏交流
-细粒度:线程之间有信息交流通讯
通过共享变量达到信息共享
JDk原生库暂不支持发送消息

多线程信息共享
-通过共享变量在多个线程中共享消息
static变量
同一个Runnable类的成员变量

-多线程信息共享问题
工作缓存副本
关键步骤缺乏加锁限制
-i++,并非原子性操作
读取主存i(正本)到工作缓存(副本)中
每个CPU执行(副本)i+1操作
CPU将结果写入到缓存(副本)中
数据从工作缓存(副本)刷到主存(正本)中

–变量副本问题的解决方法
采用volatile关键字修饰变量
保证不同线程对共享变量操作时的可见性
——————————————————————
public class TextRead {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Test t = new Test();
t.start();
Thread.sleep(1000);
t.flag = false;
System.out.println(“main is running”);
}

}
class Test extends Thread{
//用volatile修饰的变量可以及时在各线程里面通知
volatile boolean flag = true;
public void run() {
int i = 0;
//此时flag是工作缓存里的true,但主存里的flag是false
while(flag) {
i++;
}
System.out.println(“test is running”);
}
}
test is running
main is running

关键步骤加锁限制
–互斥:某一个线程运行一个代码段(关键区),其他线程不能同时运行这个代码段
–同步:多个线程的运行,必须按照某一种规定的先后顺序来运行
–互斥是同步逇一种特例
互斥的关键字是synchronized
–synchronized代码块/函数,只能一个线程进入
–synchronized加大性能负担,但是使用简单
————————————————————————————
public class TextRead {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Test t = new Test();
new Thread(t,“t0”).start();
new Thread(t,“t1”).start();
new Thread(t,“t2”).start();
new Thread(t,“t3”).start();
}

}
class Test implements Runnable{
volatile int tc = 100;
String str = new String("");
public void run() {
while(true) {
//同步代码块,一次只允许一个线程运行
synchronized (str) {
sale();
}
try {
Thread.sleep(1000);
}catch(Exception e) {
e.printStackTrace();
}
if(tc<=0) {
break;
}
}
}
public void sale() {
if(tc>0) {
System.out.println(Thread.currentThread().getName()+“is saling tc”+tc–);
}
}
}
t0is saling tc100
t3is saling tc99
t2is saling tc98
t1is saling tc97
t1is saling tc96
t3is saling tc95
t0is saling tc94
t2is saling tc93
t1is saling tc92
t2is saling tc91
t0is saling tc90
t3is saling tc89
t3is saling tc88
t1is saling tc87
t2is saling tc86
t0is saling tc85
t2is saling tc84
t3is saling tc83
t0is saling tc82
t1is saling tc81
t0is saling tc80
t2is saling tc79
t3is saling tc78
t1is saling tc77
t1is saling tc76
t0is saling tc75
t3is saling tc74
t2is saling tc73
t3is saling tc72
t1is saling tc71
t2is saling tc70
t0is saling tc69
t3is saling tc68
t2is saling tc67
t0is saling tc66
t1is saling tc65
t3is saling tc64
t2is saling tc63
t0is saling tc62
t1is saling tc61
t3is saling tc60
t2is saling tc59
t1is saling tc58
t0is saling tc57
t2is saling tc56
t3is saling tc55
t1is saling tc54
t0is saling tc53
t1is saling tc52
t3is saling tc51
t2is saling tc50
t0is saling tc49
t2is saling tc48
t1is saling tc47
t3is saling tc46
t0is saling tc45
t1is saling tc44
t0is saling tc43
t2is saling tc42
t3is saling tc41
t3is saling tc40
t2is saling tc39
t0is saling tc38
t1is saling tc37
t3is saling tc36
t0is saling tc35
t2is saling tc34
t1is saling tc33
t3is saling tc32
t1is saling tc31
t0is saling tc30
t2is saling tc29
t3is saling tc28
t0is saling tc27
t2is saling tc26
t1is saling tc25
t2is saling tc24
t1is saling tc23
t0is saling tc22
t3is saling tc21
t1is saling tc20
t0is saling tc19
t2is saling tc18
t3is saling tc17
t1is saling tc16
t2is saling tc15
t0is saling tc14
t3is saling tc13
t2is saling tc12
t0is saling tc11
t1is saling tc10
t3is saling tc9
t3is saling tc8
t2is saling tc7
t0is saling tc6
t1is saling tc5
t3is saling tc4
t2is saling tc3
t1is saling tc2
t0is saling tc1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值