线程安全与资源共享

链接:

http://tutorials.jenkov.com/java-concurrency/race-conditions-and-critical-sections.html

http://tutorials.jenkov.com/java-concurrency/thread-safety.html

http://tutorials.jenkov.com/java-concurrency/thread-safety-and-immutability.html

学习小结

多个线程访问同一资源时可能会产生竞争条件,导致竞争问题。竞争条件仅发生在多个线程访问同一资源,而存在一到多个线程写入该资源。因此清楚的知道线程目前共享的资源是很重要的。

局部变量

因为每个线程都拥有一个属于自己的栈,而局部变量存在于栈中,因此局部变量不会被共享,因此是线程安全的。

局部对象引用

局部引用和栈中的变量有点不同,局部引用变量指向了堆中的对象,而堆被所有线程共享,因此可能是线程安全的,也可能是线程不安全的。如果局部对象的引用没有返回给其他线程引用,那么该对象没有被共享,因此是线程安全的。如果对象引用被传给了其他线程使用,那么该对象已经被共享了,是线程不安全的。

成员变量

因为成员变量和对象一起被存放在堆中,因此如果多个线程访问该变量时并修改,这是线程不安全的。

因为多个线程仅仅只访问变量而不修改,是不会产生竞争条件的,因此线程是安全的。

note:

假设堆中的对象可以被多线程安全访问,他可能也是不安全的。这里说的不安全是指当对象代表文件或者数据库的资源时,尽管这个对象是线程安全的,但是他引用的资源不是线程安全的。

猜你喜欢

转载自blog.csdn.net/jdbdh/article/details/81837563