对于java中System.out.PRintln()方法,大家一定都很熟悉,我在此简单介绍一下其在多线程中的问题。 先举一个简单的例子;
public class Test { public static void main(String[] args) { MyThread myThread = new MyThread(); Thread aThread = new Thread(myThread,"A"); Thread bThread = new Thread(myThread,"B"); Thread cThread = new Thread(myThread,"C"); Thread dThread = new Thread(myThread,"D"); Thread eThread = new Thread(myThread,"E"); aThread.start(); bThread.start(); cThread.start(); dThread.start(); eThread.start(); }}class MyThread extends Thread { private int i = 5; @Override public void run() { System.out.println("i=" + (i--) + " " + Thread.currentThread().getName()); }}运行结果: 可以发现这里产生了非线性安全。我们可以先看一下System.out.println();方法的实现:
可以发现其在内部是同步的,但为什么还会产生非线性安全呢? 其实,i–的操作是在进入System.out.println()方法前发生的,因此会发生非线性安全,要注意的是,它并不是每次都会产生问题,只是存在一定的概率。
新闻热点
疑难解答