临界资源
临界资源是指一次只能被一个进程使用的共享资源。各进程之间采用互斥的方式,实现共享的资源称为临界资源。属于临界资源的硬件有打印机,磁带机等,软件有队列,变量,数组,缓冲区等。诸进程之间采用互斥的方式实现对这些资源的共享。
线程安全
基本概念
何为竞态条件
当两个线程竞争统一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称为临界区。
在临界区中使用适当的同步就可以避免竞态条件,如使用synchronize或者加锁机制。
何为线程安全
允许被多个线程执行的代码称为线程安全的代码。线程安全的代码不存在竞态条件。
对象的安全
局部基本类型变量
局部变量存储在线程自己的栈中。也就是说,局部变量永远不会被多个线程共享。所以,基本类型的局部变量是线程安全的。
局部的对象引用
对象的局部引用和基本类型的局部变量不太一样,尽管引用本身没用被共享,但引用所指向的对象并没有存储在线程的栈内。所有的对象都存在共享堆中。
如果在某个方法中创建的对象不会逃逸出(即该对象不会被其他方法获得,也不会被非局部变量引用到)该方法,那么它就是线程安全的。
实际上,哪怕将这个对象作为参数传递给其他方法,只要别的线程获取不到这个对象,那它就是线程安全的。
对象成员(成员变量)
对象成员存储在堆上。如果两个线程同时更新同一个对象的同一个成员,那这个代码就不是线程安全的。
不可变性
通过创建不可变的共享对象来保证对象在线程共享是不会被修改,从而实现线程安全