线程安全与同步

2024-02-03

我是java新手。 我对线程安全和同步有点困惑。 线程安全意味着一个方法或类实例可以被多个线程同时使用而不会出现任何问题。 其中,同步意味着单个时间只能有一个线程运行。

那么它们之间有何关系呢?


线程安全的定义在Java 并发实践 http://amzn.to/1jyE5Kx is:

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

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

有多种方法可以处理这个问题。您可以让应用程序中需要 SimpleDateFormat 对象的每个位置在每次需要时实例化一个新的对象,您可以创建一个 ThreadLocal 来保存 SimpleDateFormat 对象,以便程序的每个线程都可以访问自己的副本(因此每个线程只具有创建一个),您可以使用不保留状态的 SimpleDateFormat 的替代方案,或者您可以使用进行锁定synchronized这样一次只有一个线程可以访问 dateFormat 对象。

锁定不一定是最好的方法,尽可能避免共享可变状态是最好的。这就是为什么在 Java 8 中他们引入了一个不保持可变状态的日期格式化程序。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程安全与同步 的相关文章

随机推荐