通过加锁的方式,使得只有一个线程才可以进入临界区,保证数据的原子读写操作。

1. 多线程模式
只有多线程模式下才需要使用synchronized实现隔离,单线程程序无需考虑竞争问题。
2. 多线程访问
多个线程同时访问共享资源时,需要使用synchronized隔离。如果线程之间操作的数据互不影响,也不需要考虑。
3. 共享资源的状态会发生改变
当共享资源的状态(可以理解为成员变量)不会发生任何改变时,无需考虑线程安全问题。
1. 存在多个共享资源
2. 存在需要获取多个共享资源的场景
3. 获取共享资源的顺序是不固定的
如何打破死锁?只要打破上面三个条件中的任何一个即可避免产生死锁。
1. 被保护资源的原子性
要注意被保护资源之间是否存在关联关系,例如A和B的读写是否存在原子性,是否同时读写。
- // 原子
- synchronized{
- A = ++a;
- B = ++b;
- }
- synchronized{
- A = ++a;
- }
-
- synchronized{
- B = ++b;
- }
2. 共享资源的保护需要完整性
必须考虑所有读写共享资源的位置,防止考虑不周全导致某些位置无法得到保护。
3. long和double读写不是原子操作
4. 注意锁定的是什么资源,只有锁定相同资源的线程之间可以控制并发读写
syncoronized可以保证只有一个线程可以访问资源,而semophere可以保证最多N个线程可以同时访问资源。