- 原文:点击打开链接
- 之所以造成这个误解,大概跟线程安全的几种解决手段有关.
- 同步技术
- 多用方法内局部变量
- ThreadLocal技术(一线程,一实例变量copy)
- 线程安全的定义:
而 多线程对共享资源的改变,也是理论值之一.即理论上是接受共享资源被多个线程改变的.
- 举例如下:
下面这段程序是存在线程安全问题的,但"共享售票"并不意味着线程不安全
public class MyThread implements Runnable { } |
执行: 卖票:ticket = 5 卖票:ticket = 4 卖票:ticket = 3 卖票:ticket = 2 卖票:ticket = 1 |
因为程序执行太快了,来不及显性产生线程安全问题,我们在run()中加一个Thread.sleep(300)方法
|
运行结果如下: D:\java\source\thread\sync>java syndemo.SynDemo01 卖票:ticket = 5 卖票:ticket = 4 卖票:ticket = 3 卖票:ticket = 2 卖票:ticket = 1 卖票:ticket = 0 卖票:ticket = -1 |
当剩最后一张票时
上一个进程通过了(this.ticket > 0)的判断,却sleep了,没来得及把this.ticket--
而另一个进程趁机也通过了(this.ticket > 0)的判断
这样就形成了ticket=1时两个线程都通过测试,都进行了--,就出现了-1