奔跑中的菜鸟 2015-03-22 16:43 采纳率: 100%
浏览 1703
已采纳

多线程通信时产生的安全问题

package com.lsw.thread;

public class SocetDemo {
public static void main(String[] args) {
//创建资源对象
Resource5 r = new Resource5();
//创建任务对象
Input5 in = new Input5(r);
Output5 out = new Output5(r);
//创建线程对象
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
//开启线程
t1.start();
t2.start();
}
}

class Resource5{
String name;
String sex;
}

class Input5 implements Runnable{
private Resource5 r;
Input5(Resource5 r){
this.r = r;
}
public void run(){
int x = 0;
while(true){
if(x == 0){
r.name = "Tom";
r.sex = "man";
} else {
r.name = "小红";
r.sex = "女";
}
x = (x + 1)%2;
}
}
}

class Output5 implements Runnable{
private Resource5 r;
Output5(Resource5 r){
this.r = r;
}
public void run(){
while(true){
System.out.println(r.name + "," + r.sex);
}
}
}
打印结果:为何会出现Tom,女 和 小红,man的情况呢? 每个线程都执行的是自己独立的任务啊

  • 写回答

1条回答 默认 最新

  • danielinbiti 2015-03-22 16:56
    关注

    这种定义是线程不安全的,

     f(x == 0){
    r.name = "Tom";//这里改变后,下面sex还没来得及改变,另一个线程就打印了。所以出现你那种情况
    r.sex = "man";
    } else {
    r.name = "小红";//同上
    r.sex = "女";
    }
    

    在改变r的时候,应该加同步锁
    http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题