《Java多线程编程核心技术(第2版)》 —1.2.10 留意i--与System.out.println()出现的非线程安
1.2.10 留意i--与System.out.println()出现的非线程安全问题
在前面章节中,解决非线程安全问题使用的是synchronized关键字,本节将通过案例去细化println()方法与i--联合使用时“有可能”出现的另外一种异常情况,并说明其原因。
创建名称为sameNum的项目,自定义线程MyThread.java代码如下:
package extthread;
public class MyThread extends Thread {
private int i = 5;
@Override
public void run() {
System.out.println("i=" + (i--) + " threadName="
+ Thread.currentThread().getName());
//注意:代码i--;单独一行运行
//被改成在当前项目中的println()方法中直接进行输出
}
}
运行类Run.java代码如下:
package test;
import extthread.MyThread;
public class Run {
public static void main(String[] args) {
MyThread run = new MyThread();
Thread t1 = new Thread(run);
Thread t2 = new Thread(run);
Thread t3 = new Thread(run);
Thread t4 = new Thread(run);
Thread t5 = new Thread(run);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
程序运行后还是会出现非线程安全问题,如图1-26所示。
图1-26 非线程安全问题继续出现
本实验的测试目的是要说明:虽然println()方法在内部是同步的,但i--的操作是在进入println()之前发生的,所以发生非线程安全问题仍有一定的概率,如图1-27所示。所以,为了防止发生非线程安全问题,推荐使用同步方法。
图1-27 println()方法在内部是同步的
- 点赞
- 收藏
- 关注作者
评论(0)