继上一节的内容,在println方法内虽然说内部是同步的,但是i- -的操作却在println方法之前发生了,所以这依旧属于非线程安全问题
代码如下:
package MyThread;
public class mythread extends Thread{
private int i=5;
@Override
public void run() {
System.out.println("i=="+(i--)+"threadName="+Thread.currentThread().getName());
}
}
run方法:
package test;
import MyThread.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();
}
}
运行结果:
所以说,为了防止发生这种现象,还是应该继续使用同步的方法,也就是——synchronized
对于println方法内部同步:
public void println(String x){
synchronized(this){
print(x);
newLine();
}
}
同步方法之后:(直接在run方法前加上关键字synchronized即可)
可以看到得到了我们想要的结果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)