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版权协议,转载请附上原文出处链接和本声明。