1、当多个线程访问某个状态变量并且其中有一个献策灰姑娘执行写入操作时,必须采用同步机制来协同这些线程对变量的访问。Java中的主要同步机制是关键字synchronized,他提供了一种独占的加锁方式。
2、在任何情况下,只有当类中仅包含自己的状态时,线程安全类才是有意义的。
3、当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些献策灰姑娘讲如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。
4、无状态对象一定是线程安全的。
5、原子操作是指,对于访问同一个状态的所有操作(包括该操作本身)来说,这个操作是一个以原子方式执行的操作。
6、尽可能地使用现有的线程安全对象(原子变量)(例如AcomicLong)来管理类的状态。与非线程安全的对象相比,判断线程安全对象的可能状态极其状态转换情况要更为容易,从而也更容易维护和验证线程安全性。
7、要保持状态的一致性,就需要在单个原子操作中更新所有相关的状态变量。
8、每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁(Intrinsic Lock)或监视器锁(Monitor Lock)。线程在进入同步代码块之前会自动获得锁,并且在退出同步代码块时自动释放锁。
9、并发环境中的原子性与事务应用程序中的原子性有着相同的含义——一组语句作为一个不可分割的单元被执行。任何一个执行同步代码块的线程,都不可能看到有其他线程正在执行由同一个锁保护的同步代码块。
10、重入,获取锁的操作的粒度是“线程”,而不是“调用”。内置锁(Synchronized Block)是可重入的。
11、每个共享的和可变的变量都应该只由一个锁来保护,从而使维护人员知道是哪一个锁。
12、对于每个包含多个变量的不变性条件,其中涉及的所有变量都需要由同一个锁来保护。
13、大哥执行时间较长的计算或者可能无法快速完成的操作时看,一定不要持有锁。