这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战
线程安全与共享资源
由多个线程同时调用时,仍然是安全的代码为线程安全。由此可知,线程安全不包含竞争条件。竞争条件仅在多个资源共享修改时才会发生,因此了解那些资源在java中是共享的十分必要。
局部变量
局部变量意味着位于自己线程的堆栈中,因此永远不会在线程之间发生共享。当然,这也意味着所有局部变量都是线程安全的。
本地创建对象
本地创建对象有一些不同。对于对象的引用在各自线程中,但是对象本身确实创建在共享内存之中。如果不同新城不发成对象的传递,也就是对象不会从方法中逃逸出去,那么对象可以认为是线程安全的,每个线程都会创建独立的对象。但是一旦对象被方法传递出去,被其他线程引用,则可能是线程不安全的。
对象成员变量
对象的成员变量与对象一起存储在堆中。
- 如果两个线程对同一个对象的实例进行引用,并且调用方法修改了对象的成员变量,那么这就是线程不安全的。
- 如果两个线程调用同个非线程安全实例的方法,则会导致竞争条件。
- 如果两个线程在不同的实例上调用同一方法,这不会导致竞争条件,因为二者的实例是不同的。即使对象不是线程安全的,但是由于二者的实例不相同,因此并不会产生竞争条件。
线程控制转移规则
如果同一资源在同一线程下创建、使用和处置资源,且永远不会脱离该线程的控制,则可以认为是线程安全的。
资源可以是任何共享资源,如对象、数组、文件、数据库连接、套接字等。在java中并不总是显式的处置资源,处置可以认为是断开引用关系。即使对象的使用是线程安全的,如果该对象指向文件或数据库等共享资源,那么作为一个整体,仍然是线程不安全的。这也可能发生在对文件或其他共享资源进行操作的线程中。因此,区分线程控制的对象是资源还是引用资源则十分重要。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。