多线程之间通讯
2018-07-24 07:52:42来源:博客园 阅读 ()
多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。
第一个线程写入count,另一个线程取读取count的值.实现读一个,写一个操作。
class Res{ public String username; public String sex; } class Out extends Thread{ Res res; public Out(Res res){ this.res=res; } @Override public void run() { //写操作 int count=0; while (true){ // synchronized (res.getClass()){ if(count==0){//偶数 res.username="小明"; res.sex="男"; } else {//奇数 res.username="小红"; res.sex="女"; } count=(count+1)%2; // } } } } class Input extends Thread{ Res res; public Input(Res res){ this.res=res; } @Override public void run() { while (true){ // synchronized (res.getClass()){ System.out.println(res.username+","+res.sex); // } } } } public class OutInputThread { public static void main(String[] args) { Res res = new Res(); Out out = new Out(res); Input input = new Input(res); out.start(); input.start(); } }
输出如下:
小明,男
小明,女
小红,女
小明,男
数据格式发生错误?????System.out.println(res.username+","+res.sex);Input这一句在输出username时,可能Out又修改了Res对象的值为小红/小明,导致sex发生混乱,,也就是说多线程下,读写同一个资源也可能发生线程安全问题,可见性不具备原子性。
具体原因请参考Java内存模型。。。https://blog.csdn.net/qq_37049496/article/details/81172330
怎么解决?同步而且是两个线程都需要同步,取消注释即可保证对共享资源res的操作同一时刻仅有一个线程。。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 最详细的java多线程教程来了 2020-06-08
- 系统化学习多线程(一) 2020-06-08
- 设计模式---类之间的关系知多少 2020-06-07
- 多线程:生产者消费者(管程法、信号灯法) 2020-06-01
- 如何合理地估算线程池大小? 2020-05-31
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash