java - 线程安全程序的方法

标签 java concurrency thread-safety

全部,

编写线程安全程序应该采用什么方法。给定一个问题陈述,我的观点是:

1 > 首先为单线程环境编写代码。
2 > 在需要原子性的字段下划线并替换为可能的并发类
3 > 在关键部分下划线并将其括在同步
中 4> 执行死锁测试

有人对我的方法的其他方法或改进有任何建议吗?到目前为止,我可以看到自己将大部分代码都包含在同步块(synchronized block)中,并且我确信这是不正确的。

Java 编程

最佳答案

编写正确的多线程代码很困难,并且没有神奇的公式或一组步骤可以帮助您实现这一目标。但是,您可以遵循一些准则。

就我个人而言,我不会先为单线程环境编写代码,然后将其转换为多线程环境。好的多线程代码在设计之初就考虑到了多线程。字段的原子性只是并发代码的要素之一。

您应该决定代码的哪些区域需要多线程(在多线程应用程序中,通常并非所有内容都需要线程安全)。然后您需要设计这些部分如何是线程安全的。使代码的一个区域成为线程安全的方法可能与使其他区域不同的方法不同。例如,了解是否会有大量读取和写入很重要,并且可能会影响您用来保护数据的锁类型。

不变性也是线程安全代码的关键要素。当元素是不可变的(即无法更改)时,您无需担心多个线程修改它们,因为它们无法更改。这可以极大地简化线程安全问题,并让您能够专注于拥有多个数据读取器和写入器的地方。

了解 Java 中并发的细节(以及 Java 内存模型的细节)非常重要。如果您还不熟悉这些概念,我建议您阅读 Java 并发实践 http://www.javaconcurrencyinpractice.com/ .

关于java - 线程安全程序的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3902955/

相关文章:

java - Android Media Muxer 不工作 [Android/Java]

java - 有人能解释一下这个Java线程池吗?

c++ - 如果我在 _mm_clflushopt() 之后不发出 _mm_sfence() 会发生什么(不好的)事情?

Java CAS 操作比 C 等效操作执行得更快,为什么?

java - 如何 "try start"一个线程从几个其他线程,java

multithreading - 多线程锁定,有趣的时光(期中练习)

java - 是否可以仅针对特定风格包含并初始化 HockeyApp SDK?

java - ExecutorService 的 shutdown() 不会等到所有线程都完成

java - 有什么方法可以从本地计算机(本地服务器)读取数据库文件并将其复制到android中的 Assets 文件夹中?

go - 我可以同时更新 Golang map 吗?