- 论坛徽章:
- 0
|
上面的代码 是不具备线程安全性的. "结果这段代码中注释句去掉注释的话,会有"flag is true"的输出,但是注释加上的话,就永远不会输出"flag is true" "
你看到的这个输出结果是不可控的, 这里一共有两个线程 : 1 main方法, 2 t.start()
两个线程可以同时操作 对象t的 flag属性, 有可能main方法刚刚调用完 t.setFlag()方法 第二个线程就执行了 flag = false , 而main方法中的第二次循环还没有来得及第二次调用setFlag()方法 . t.start()线程的第二次循环就已经执行到了if(flag),而此时 flag = false. 所以不输出 flag is true. (跟你睡眠0.5秒与否关系不大,只是不睡眠,打印flag is true的可能性会比较大)
输出结果会受 两个线程的执行进度影响, 而我们几乎无法控制这两个线程的执行进度,即使你对线程设定了执行优先级. 所以最后的输出结果是完全不可预期的,你看到的结果只是一个现象,可能同样的代码你放到不同的机器上结果又会不同.跟你的注释句也没什么关系. 至于你问为什么会看到这样的输出结果, 只能说 不可控 什么输出结果都有可能.
所以最好使用synchronized来控制线程同步,保证某些代码不会被 不同线程同时执行, 比如这里 对flag值的操作 |
|