线程主要通过对某块字段和引用字段所引用的对象们的共享存取来实现通信。
这种形式的通信非常有效但可能出现两种错误:线程冲突和内存一致性错误。防止这些错误的工具是同步。 然而,同步可能引入线程竞争,当两个或多个线程试图同时访问相同的资源,并导致了Java运行时更慢的执行一个或多个线程,或者甚至暂停其执行时,线程竞争就发生了。饥饿和活锁是线程竞争的形式。
当连个不同线程中的两个操作对同一个数据交叉存取时,冲突就会发生。
内存一致性错误
当不同线程对相同数据的视角不同时,就会发生内存一致性错误。 避免内存一致性错误的关键是理解前发生(happens-before)这种关系原则,前发生关系原则仅仅是某个具体语句对内存写时必须保证对其它一些特定语句可见。
有几种可以用来创建前发生关系的方法。其中之一是同步。
同步是通过使用内部锁(intrinsic lock)或监视锁(monitor lock)的内部实体而实现的
每个对象都拥有与他相关的内部锁。