线程的安全
线程的安全
案例:三个窗口买100张票
出现负号票,出现重复票。??? 多个线程操作共享数据
如何解决多线程解决安全问题?
- 基本思想:让程序没有安全问题的环境
并发编程的三大问题
-
原子性
-
可见性
-
有序性
原子性
是指在一次操作或者多次操作中,要么所有的操作全部得到了执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行,多个操作是一个不可分割的整体。
Java中提供了如下几种方法保证代码的原子性:
- synchronized
- Lock锁:JDK5以后支持
- 原子类AtomicInteger
可见性
多线程所共享的数据,一旦被一个线程修改,其他线程能够及时获取到共享数据的最新值。(从内存模型的角度来说,被volatile关键字修饰的变量,一经更改,会被立即刷新到主内存,保证其他线程对该变量的可见性)。
有序性
代码执行阶段时的执行顺序可能与代码的书写顺序不一致,在单线程时不会存在安全问题。但代码重排序,多线程时会引发安全性问题。
并发工具类
- HashTable
- ConcurrentHashMap
- CountDownLatch
- Semaphore: 可以控制访问特定资源的线程数量。