线程不安全产生的原因

线程安全是多线程领域的问题。在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。
如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。
实际上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生。
只要资源没有发生变化,多个线程读取相同的资源就是安全的。
当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。

 

如何判断资源对象是否是线程安全?

局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享。所以,基础类型的局部变量是线程安全的。
如果局部变量是一个引用或指针呢?尽管引用或指针本身没有被共享,但引用所指的对象并没有存储在线程的栈内,所有的对象都存在共享堆中,所以引用或指针不是线程安全的
注意,即使对象本身线程安全,但如果该对象中包含其他资源(文件,数据库连接),整个应用也许就不再是线程安全的了。
综上,如果一个资源的创建,使用,销毁都在同一个线程内完成,且永远不会脱离该线程的控制,则该资源的使用就是线程安全的。
资源可以是对象,数组,文件,数据库连接,套接字等等。

 

如何保证线程安全?

1、减少跨线程变量的使用。能使用局部变量实现的就用局部变量实现。API要实现线程安全。
2、跨线程变量能只读就只读。我们可以通过创建不可变的共享对象来保证对象在线程间共享时不会被修改,从而实现线程安全。
3、跨线程通信,能使用线程通信机制的就用。
4、加锁。
5、加临界区,关闭所有中断。

6、禁止线程(任务)调度。

posted on 2021-10-05 16:50  长缨在手_521  阅读(64)  评论(0)    收藏  举报