九十九、多线程可能出现的异常问题

1.共享数据的线程安全

共享数据就是多个线程可以访问同一个变量。伴随而来的就是数据安全问题,可能导致数据在每一个线程中运行导致数据更新不及时问题。

public class ThreadShareData {
	public static void main(String[] args) {
		SimpleThread simpleThread = new SimpleThread();
		Thread a = new Thread(simpleThread,"A");
		Thread b = new Thread(simpleThread,"B");
		Thread c = new Thread(simpleThread,"C");
		Thread d = new Thread(simpleThread,"D");
		Thread e = new Thread(simpleThread,"E");
		a.start();
		b.start();
		c.start();
		d.start();
		e.start();
	}
}

class SimpleThread extends Thread{
	private int count = 5;
	@Override
	public void run() {
		super.run();
		//这里不能使用for循环,因为使用同步之后其他线程得不到运行的机会
		count--;
		System.out.println("由"+this.currentThread().getName()+"计算得出 count = "+count);
	}
}

输出结果:
由A计算得出 count = 1
由B计算得出 count = 1
由C计算得出 count = 1
由E计算得出 count = 0
由D计算得出 count = 1
理论上导出,count的值应该是依次递减,但是上述结果是非线程安全的。需要在执行方法中加锁。

2.留意i–与System.out.println()的异常

println()与i- -联合使用可能出现的一种异常情况,示例如下:

public class ThreadShareData {
	public static void main(String[] args) {
		SimpleThread simpleThread = new SimpleThread();
		Thread a = new Thread(simpleThread);
		Thread b = new Thread(simpleThread);
		Thread c = new Thread(simpleThread);
		Thread d = new Thread(simpleThread);
		Thread e = new Thread(simpleThread);
		a.start();
		b.start();
		c.start();
		d.start();
		e.start();
	}
}
class SimpleThread extends Thread{
	private int count = 5;
	@Override
	public void run() {
		System.out.println("由"+this.currentThread().getName()+"计算得出 count = " + count--);
	}
}

输出结果:
由Thread-1计算得出 count = 5
由Thread-5计算得出 count = 1
由Thread-2计算得出 count = 3
由Thread-4计算得出 count = 2
由Thread-3计算得出 count = 4
虽然println()方法在内部是同步的,但i- -的操作却是在进入println()之前发生的,所以有发生非线程安全问题的概率。


版权声明:本文为plp1992原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。