iteye_12970 2011-05-09 12:03
浏览 240
已采纳

关于方法同步顺序的讨论

在 The JavaTM Virtual Machine Specification CHAPTER 8--- 8.11 Example: Out-of-Order Writes
中 有这么一个例子:

[code="java"]class Simple {
int a = 1, b = 2;
void to() {
a = 3;
b = 4;
}
void fro()
System.out.println("a= " + a + ", b=" + b);
}
}[/code]

文中阐述的大概意思是 如果 方法 to 和fro 不进行同步 那么 两个线程 一个访问to 一个访问fro 结果 a,b有可能出现任意值组合,
我自己写了一个程序模拟这个操作 但是总是不能成功的模拟出 不同步状态下 乱序的结果

以下是我的代码

[code="java"]
public class Simple {
int a = 1, b = 2;
void to() {
a = 3;
b = 4;
}
void from() {
System.out.println(Thread.currentThread().getName()+" a= " + a + ", b=" + b);
}

public static void main(String[] args){
    final Simple a = new Simple();
    Runnable r1 = new Runnable(){
        public void run() {
            a.from();

        }
    };
    Runnable r = new Runnable(){
        public void run() {
            a.to();

        }
    };



    new Thread(r1).start();
    new Thread(r).start();

}

}
[/code]

结果 总是:

Thread-0 a= 1, b=2
如果 调换 执行顺序

new Thread(r).start();
    new Thread(r1).start();

那么结果是:

Thread-1 a= 3, b=4

我的问题是 如何才能模拟出乱序的结果 比如
a =1,b =4
或者
a =3 ,b=2
这样因为没有同步造成的结果不一致现象?

同样的问题 在 Java Concurrency In Practice Chapter 16. The Java Memory Model 中 描述 reording时 的一个DEMO

[code="java"]
public class PossibleReordering {
static int x = 0, y = 0;
static int a = 0, b = 0;
public static void main(String[] args)throws InterruptedException {
Thread one = new Thread(new Runnable() {
public void run() {
a = 1;
x = b;
}
});
Thread other = new Thread(new Runnable() {
public void run() {
b = 1;
y = a;
}
});
one.start();
other.start();
one.join();
other.join();
System.out.println("( "+ x + "," + y + ")");

}
}
[/code]

这段代码在文章中 被当成没有同步的状态,有可能导致多个结果 但是我运行了很多次 都是一个结果:
( 0,1)

  • 写回答

3条回答 默认 最新

  • redstarofsleep 2011-05-09 13:02
    关注

    因为你的电脑跑的太快了,你在to里sleep一下

    [code="java"]
    void to() {

    a = 3;
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    b = 4;

    }

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大