线程安全与同步

我是新来的Java。 我在Threadsafe和synchronized之间有点混乱。 线程安全意味着一个方法或类实例可以被多个线程同时使用而不会发生任何问题。 同步意味着只有一个线程可以一次运行。

那么他们如何相互关联?


Java Concurrency in Practice中给出的线程安全性的定义是:

如果一个类在从多个线程访问时行为正确,则类是线程安全的,无论运行时环境如何调度或交错执行这些线程,以及调用代码没有额外的同步或其他协调。

例如,java.text.SimpleDateFormat对象具有内部可变状态,当调用解析或格式的方法时,该对象会被修改。 如果多个线程调用同一个dateformat对象的方法,则线程可能会修改其他线程所需的状态,从而导致某些线程获得的结果可能出错。 内部状态被破坏导致错误输出的可能性使得这个类不是线程安全的。

有多种方法来处理这个问题。 您可以让需要SimpleDateFormat对象的应用程序中的每个位置在每次需要时创建一个新对象,您可以使ThreadLocal持有SimpleDateFormat对象,以便程序的每个线程都可以访问自己的副本(因此每个线程只有创建一个),可以使用不保持状态的SimpleDateFormat的替代方法,也可以使用synchronized来锁定,以便一次只有一个线程可以访问dateFormat对象。 锁定不一定是最好的方法,尽可能避免共享可变状态是最好的。

synchronized关键字是限制对方法或代码块的访问的一种方式,否则线程不安全的数据不会被破坏。 此关键字通过要求线程必须获取对某个锁的独占访问来保护该方法或块(对象实例,如果同步在实例方法上,或者类实例,如果同步在静态方法上,或者指定如果使用同步块,则锁定),然后才能进入方法或块,同时提供内存可见性,以便线程不会看到过时的数据。


线程安全是程序的期望行为,其中synchronized块可帮助您实现该行为。 还有其他获得线程安全性的方法,例如不可变类/对象。 希望这可以帮助。


线程安全 :线程安全的程序可以保护数据免于内存一致性错误。 在高度多线程的程序中,线程安全程序不会对多个共享数据(对象)上的多个线程执行多个读写操作产生副作用。 不同的线程可以共享和修改对象数据而没有一致性错误

synchronized是实现ThreadSafe代码的一种基本方法。

有关更多详细信息,请参阅以下SE问题:

“同步”是什么意思?

您可以通过使用高级并发API来实现线程安全。 这个文档页面提供了很好的编程结构来实现线程安全。

锁对象支持简化许多并发应用程序的锁定习惯用法。

并发集合可以更轻松地管理大量数据,并且可以大大减少同步需求。

原子变量具有最小化同步并有助于避免内存一致性错误的功能。

ThreadLocalRandom (在JDK 7中)可以从多个线程高效地生成伪随机数。

其他编程结构也参考java.util.concurrent和java.util.concurrent.atomic包。

相关的SE问题:

同步与锁定

链接地址: http://www.djcxy.com/p/91861.html

上一篇: Threadsafe vs Synchronized

下一篇: Getting object lock with synchronized method