println()方法与i--联合使用时“有可能”出现异常,虽然println()方法在内部是同步的,但i--的操作却是在进入println()之前发生的,所以有发生非线程安全问题的概率,如图 1-4所示。
图 1-4 println内部同步
示例代码如下:
package com.vhqimk.thread;
/*
* 测试i--与println()联合使用时可能出现异常
*/
public class Test {
public static void main(String[] args) {
// 创建一个MyThread对象,并将该对象分别加载到五个线程中并分别给线程命名
MyThread myThread = new MyThread();
Thread t1 = new Thread(myThread);
Thread t2 = new Thread(myThread);
Thread t3 = new Thread(myThread);
Thread t4 = new Thread(myThread);
Thread t5 = new Thread(myThread);
// 启动五个线程
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
class MyThread extends Thread {
private int i = 5;
public void run() {
System.out.println("i=" + (i--) + " threadName=" + Thread.currentThread().getName());
}
}
运行结果可能出现异常如图 1-5所示
图 1-5 出现非线程安全问题
所以,为了防止发生非线程安全问题还应使用同步方法,即在run()方法前最前面加上synchronized,加上之后运行结果如图 1-6所示
图 1-6 没有非线程安全问题
**总结:**println()与i–联合使用时可能会出现非线程安全问题,解决方法仍是使用同步方法,即在需要同步的方法前加上关键字synchronized。