AtomicReference 和 Synchronized 之间有什么区别?

2023-11-25

AtomicReference 和 Synchronized 之间有什么区别吗?
E.G.

public class Internet {
    AtomicReference<String> address;
    public String getAddress(){
        return address.toString();
    }
    public void setAddress(String address) {
        this.address.set(address);
    }

}

我将类传递给一些尝试同时使用该类的线程,如果我使用这个,是一样的事情吗:

public class Internet {
    String address;
    public String getAddress(){
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

然后在线程中使用synchronized在进入课堂之前?


您没有在第一个示例中初始化引用,它可能应该是:

public class Internet {
    AtomicReference<String> address = new AtomicReference<String>();
    public String getAddress(){
        String s = address.get();
        return s == null ? null : s.toString();
    }
    public void setAddress(String address) {
        this.address.set(address);
    }
}

访问限制所在的位置很重要。如果将控制权放在正在访问的对象中,那么它就可以单独控制其不变量,这比依赖线程正确同步要脆弱得多,在后者中,一个行为不当的访问线程可能会破坏正在访问的对象。所以第一个例子在这个方面要好得多。

如果您更改第二个示例,以便对象可以控制自己的锁定(因此它不依赖于访问它的线程来安全地执行此操作),如下所示:

public class Internet {
    private final Object lock = new Object();
    private String s;
    public String getAddress() {
       synchronized(lock) {
           return s;
       }
    }
    public void setAddress(String s) {
        synchronized(lock) {
            this.s = s;
        }
    }
}

然后是更仔细的比较,一个依赖于锁定,另一个依赖于原子引用。使用 AtomicReference 的方法试图避免使用机器级原子处理指令进行锁定。哪个更快可能取决于您的硬件和 jvm 以及处理负载,通常原子方法应该更快。同步方法是一种更通用的机制;使用同步块,您可以更轻松地将多个分配组合在一起,而使用原子引用则涉及更多。

正如詹姆斯在回答中所说,通过同步,您的线程正在等待锁;没有超时,并且可能出现死锁。通过原子引用,线程无需等待共享锁即可进行更改。

实现这一点的最简单且性能最佳的方法是组织代码,以便使对象不可变,从而避免所有锁定、忙等待和缓存更新:

public final class Internet {
    private final String s;
    public Internet(String s) {
        this.s = s;
    }
    public String getAddress() {return s;}
}

按优先顺序降序排列:

  • 尽可能选择不变性。
  • 对于不能不可变的代码,请尝试将更改限制在线程中。
  • 如果只有一件事需要跨线程更改,请使用原子方法。
  • 如果跨线程的多个更改需要一起发生而不受其他线程的干扰,请使用锁定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AtomicReference 和 Synchronized 之间有什么区别? 的相关文章

随机推荐

  • dequeueReusableCellWithIdentifier 不重用单元格

    我有一个UICollectionView使用自定义单元格子类化UICollectionViewCell 在代码中我做了以下事情 self collectionView registerClass AHPinterestCell class
  • 有没有办法在 Emacs 中重新平铺缓冲区窗口?

    我在 emacs 中打开了两个缓冲区窗口 垂直排列 是否有命令可以水平重新排列它们 The 转置框架库提供了一组出色的功能来操作框架中的窗口 任何transpose frame rotate frame clockwise or rotat
  • Laravel 5 动态运行迁移

    所以我创建了自己的博客包 其结构为Packages Sitemanager Blog我有一个如下所示的服务提供商 namespace Sitemanager Blog use Illuminate Support ServiceProvid
  • Firebase crashlytics 不报告崩溃

    我正在从 Fabric 升级到 Firebase crashlytics 我已将 Firebase 和 Fabric Crashlytics pod 添加到我的项目中 添加了 plist 等 除了没有报告崩溃之外 一切似乎都工作正常 我正在
  • 如何使用 Monad 的 (->) 实例以及 (->) 的困惑

    在不同的问题上 我在评论中找到了有关使用 gt Monad 的实例 例如实现无点风格 对于我来说 这有点太抽象了 好的 我已经看到了 Arrow 实例 gt 在我看来 gt 可以在实例符号中使用 但不能在类型声明中使用 这将是另一个问题的内
  • 如何从 xaml 访问 UserControl 内的按钮?

    在工作中 我有几个页面 每个页面的按钮都位于相同的位置 并且具有相同的属性 每个页面也有细微的差别 为此 我们创建了一个用户控件模板并将所有按钮放入其中 然后将该用户控件应用到所有页面 然而 现在访问按钮并从每个页面的 xaml 修改它们相
  • Google 地图问题:关闭和按引用传递

    我遇到一些 Google 地图 Javascript 问题 我想我知道问题出在哪里 但只是不知道解决方法 我的问题的一个例子是here 无论您单击什么标记 都会显示第二个标记 显然 我将错误的信息传递到我的事件监听器中 但我似乎无法获得正确
  • Qt 的 QGraphicsItem 中的事件和信号:这*应该*如何工作?

    与 Qt 中的其他图元一样 QGraphicsItems 可以处理鼠标事件等 甜的 现在假设我需要将一个 QGraphicsItem 上的事件传播到同一场景中的其他一些 QGraphicsItems 我可以想到两种方法可以解决这个问题 A
  • PHP 的 OAuth 2.0 服务器

    我一直在努力寻找一个支持 OAuth 2 0 作为服务器的活跃开源 PHP 项目 有大量的客户端示例连接到 Facebook Twitter 等 但随着越来越多的人希望通过 API 公开自己的服务 我有点惊讶开源社区尚未解决这一需求 并不是
  • wpf:如何弹出用户控件?

    背景 我有一个使用数据网格来显示数据的项目 数据网格有一个包含用户控件的 rowdetail 列 用户控件有一些文本框供用户输入和显示一些消息 问题 我想在单击按钮时弹出用户控件 并且弹出的用户控件与数据网格的 rowdetail 列中的用
  • 他们是否将 copy_if 添加到 c++0x 中?

    很烦人的是copy if不是 C 中的 有谁知道它是否会在 C 0x 中 由于C 0x还没有最终定型 所以只能看一下最新的draft
  • React-table 单个单元格样式

    我正在使用反应表 并希望根据内部的数量更改特定单元格的背景颜色 前任 单元格 gt 1 绿色 单元格 我知道这段代码不起作用 但希望它能显示我正在寻找的内容
  • 从 XAML 引用嵌套枚举类型

    我似乎无法从 XAML 引用公共嵌套枚举类型 我有课 namespace MyNamespace public class MyClass public enum MyEnum A B 我尝试参考MyEnum在 Xaml 中是这样的 xml
  • 只选择 mysql 中唯一的行/记录

    我想看看如何才能获得具有独特城市的唯一行 记录 而不关心它是否是首都 例如 Akron akron aKRON 只会返回一条记录 我厌倦了这样的事情 但它不起作用 SELECT DISTINCT city AS city state pre
  • 使用 Spring Boot、飞碟和 Thymeleaf 时图像未显示在 PDF 模板中

    我使用 Spring Boot 飞碟 thymeleaf 从 html 模板创建一个 pdf 文件 但图像没有显示在我的文件中 项目结构 代码html div class col xs 6 invoice col 2 img src sta
  • Microsoft Enterprise Library 5.0 日志记录应用程序块线程安全吗?

    我有一些代码将使用 Enterprise Library 5 0 中的日志记录应用程序块从不同的线程进行日志记录 LAB 线程安全吗 我可以像平常一样从不同的线程进行日志记录吗 还是需要同步日志记录代码 以便一次仅从一个线程使用 Enter
  • 对对象列表中的所有对象调用方法的惯用方法

    我有一个对象列表 它们有一个称为 process 的方法 在 Python 2 中可以做到这一点 map lambda x x process my object list 在 Python 3 中 这将不起作用 因为在遍历可迭代之前 ma
  • C# 检查一个图像是否存在于另一个图像中

    我不知道从哪里开始 所以一些指导会很好 我需要实现的是 检查一个大图像 例如 1280x1024 并检查其中是否存在另一个较小的图像 可能是 50x50 像素图像 我尝试通过比较每个像素来做到这一点 这非常慢 而且我可能需要执行 100 多
  • 通过jQuery为每个li元素添加不同的ID

    我是新来的 我想问一个关于 jQuery 的问题 我有无序列表 例如 ul li class something a href a li li class something a href a li li class something a
  • AtomicReference 和 Synchronized 之间有什么区别?

    AtomicReference 和 Synchronized 之间有什么区别吗 E G public class Internet AtomicReference