java 中的同步 - 正确使用

2023-12-31

我正在构建一个在多进程(线程)中使用的简单程序。

我的问题更容易理解 - 什么时候我必须使用保留字同步?

我是否需要在影响骨骼变量的任何方法中使用这个词?

我知道我可以将它放在任何非静态的方法上,但我想了解更多。

谢谢你!

这是代码:

public class Container {
// *** data members ***
public static final int INIT_SIZE=10;  // the first (init) size of the set.
public static final int RESCALE=10;   // the re-scale factor of this set.
private int _sp=0;
public Object[] _data;
/************ Constructors ************/
public Container(){
    _sp=0;
    _data = new Object[INIT_SIZE];
}
public Container(Container other) {  // copy constructor
    this();
    for(int i=0;i<other.size();i++) this.add(other.at(i));
}

/** return true is this collection is empty, else return false. */
public synchronized boolean isEmpty() {return _sp==0;}

/** add an Object to this set */
public synchronized void add (Object p){
    if (_sp==_data.length) rescale(RESCALE);
    _data[_sp] = p;  // shellow copy semantic.
    _sp++;
}   

/** returns the actual amount of Objects contained in this collection */
public synchronized int size() {return _sp;}

/** returns true if this container contains an element which is equals to ob */
public synchronized boolean isMember(Object ob) {
    return get(ob)!=-1;
}

/** return the index of the first object which equals ob, if none returns -1 */
public synchronized int get(Object ob) {
    int ans=-1;
    for(int i=0;i<size();i=i+1)
        if(at(i).equals(ob)) return i;
    return ans;
}

/** returns the element located at the ind place in this container (null if out of range) */
public synchronized Object at(int p){
    if (p>=0 && p<size()) return _data[p];
    else return null;
}

使类能够安全地进行多线程访问是一个复杂的主题。如果您这样做不是为了了解线程,那么您应该尝试找到一个可以为您完成此操作的库。

话虽如此,首先要想象两个单独的线程以交替的方式逐行执行一个方法,然后看看会出现什么问题。例如,上面写的 add() 方法很容易受到数据破坏。想象一下线程 1 和线程 2 或多或少同时调用 add()。如果线程 1 运行第 2 行,并且在到达第 3 行之前,线程 2 运行第 2 行,则线程 2 将覆盖线程 1 的值。因此,您需要某种方法来防止线程像这样交错。另一方面,isEmpty() 方法不需要同步,因为只有一条指令将值与 0 进行比较。同样,很难正确处理这些内容。

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

java 中的同步 - 正确使用 的相关文章

随机推荐

  • 基于内容的节流

    我想知道Camel是否可以根据交换的内容进行限制 情况如下 我必须通过soap 调用网络服务 其中 发送到该webservice的参数中有一个customerId 问题是 如果给定的 customerId 每分钟有超过 1 个请求 则 We
  • jQuery keyup keyCode 在 Opera 中不起作用

    Opera 浏览器是否有可能忽略 keyCode 40 向下箭头 test keyup function e body append e keyCode 测试它 http www jsfiddle net V9Euk 454 http ww
  • 如何将已知的接口属性与自定义索引签名结合起来?

    如何键入一个可以同时具有几个属性的对象声明的可选属性 e g hello string moo boolean 以及自定义属性 必须是函数 例如 custom string v any gt boolean 这就是我想看到的 例如 cons
  • 递归查询中不允许使用聚合函数。有没有其他方法可以编写此查询?

    TL DR我不知道如何编写在递归部分不使用聚合函数的递归 Postgres 查询 是否有其他方法可以编写如下所示的递归查询 假设我们有一些运动 CREATE TABLE sports id INTEGER name TEXT INSERT
  • WinRt 页面导航

    如何从自定义类内部的代码导航到页面 例如 假设我的 MainPage xaml cs 中有以下代码 private void DoSomething object sender RoutedEventArgs e var work new
  • Android 低内存杀手和应用程序后台堆栈

    当系统内存不足时 Android系统可能会决定删除某个应用程序进程 以便回收资源以进行更重要的工作 即启动属于另一个应用程序的服务 但是 我无法确定 Android 系统是否可以仅删除应用程序任务 返回堆栈 而不触及相应的应用程序进程 如果
  • 无法安装 deepface,因为软件包版本有冲突

    我正在尝试在 mac m1 上安装 deepface 我已经安装了tensorflow macos当前版本是2 5 0 但是当我尝试安装 deepface 时 它 说依赖项版本存在冲突 例如deepface 0 0 65 depends o
  • 如何在 SELECT FOR XML 查询中选择返回的列名?

    MS SQL 有一种方便的解决方法 可以将多行中的列值连接成一个值 SELECT col1 FROM table1 WHERE col2 x ORDER by col3 FOR XML path 这会返回一个很好的记录集 XML F52E2
  • 我们可以通过编程方式注销 Facebook吗

    我使用 facebook sdk 3 1 在我的 iphone 应用程序中进行 facebook 登录 登录后 它将进入我的应用程序 但我没有提供任何注销按钮 所以 当我们单击 facebook 登录按钮时 我将获得以前的用户 facebo
  • AS3:NetStream 的音频活动级别

    我 再次 抓狂 试图找到一种读取 NetStream 音频活动级别的方法 类似于使用麦克风执行此操作的方法 我不想让每个客户端通过 SharedObjects 等发送它的活动级别 这似乎是真正让它工作的唯一方法 非常感谢 Dave 在 AS
  • JSP“无法解决导入问题”

    我正在尝试从 JSP 页面调用 Java 类 我已经使用 JDeveloper 创建了该项目 我收到一条错误消息 无法解析导入 我已经在根文件夹的WEB INF中添加了Class文件 并尝试编译 但仍然显示相同的错误 下面是代码 p p
  • SQL 如何在多个分区上进行选择?

    有没有比以下更有效的方法 select from transactions partition partition1 union all select from transactions partition partition2 union
  • c# Linq to Objects - FirstOrDefault 性能

    我们正在尝试优化一些方法 我们使用 Redgate 的性能分析器来查找一些性能漏洞 我们的工具通过多种方法使用 Linq to 对象 但我们注意到 一个FirstOrDefault收集 1000 个对象需要很长时间 探查器还警告查询速度非常
  • 在 SparkSQL 中使用 Avro 模式和 Parquet 格式进行读/写

    我正在尝试从 SparkSQL 写入和读取 Parquet 文件 出于模式演变的原因 我想在写入和读取中使用 Avro 模式 我的理解是 这可以在 Spark 之外 或在 Spark 中手动 使用例如AvroParquetWriter 和
  • 旋转端口登陆Android4.X后如何避免智能手机中的剪切/复制/粘贴?

    我正在努力避免在智能手机中剪切 复制 粘贴 对于平板电脑来说没问题 它在端口模式下很好 但在陆地模式下 EditText 显示一个 下一步 按钮 选择文本后 下一个按钮将转换为具有复制 剪切和粘贴选项的编辑按钮 那么 当编辑按钮出现时 有什
  • Java 中条件运算符内部的转换

    这会在 Eclipse IDE 中出现错误 错误符号出现在行号附近 String allText null 之后我做了一些事情 比如初始化数组等等 但要根据一些条件 所以我想使用如下所示的条件运算符 List
  • 是否可以仅在加载所有模块后才显示 shell?

    我目前正在开发一个应用程序 该应用程序使用 PRISM 4 将其功能划分为不同的模块 我注意到我的应用程序的 Shell 在其区域中保存了模块的视图 在加载模块之前加载并显示 这意味着首先显示 Shell 然后在相当长的时间 大约半秒 之后
  • 不带括号和带括号调用函数有什么区别

    在 onPressed 或 Ontap 上调用不带括号的函数和带括号的函数有什么区别 我只知道在 onPressed 上不能用括号调用 void 函数 floatingActionButton FloatingActionButton on
  • mutate 是否通过引用更改 tbl?

    我真正喜欢的是什么data table is the 通过引用更改表的习惯用法 无需昂贵的副本 据我了解 这是使data table与其他方法相比 速度超快 现在 我开始玩dplyr包似乎具有同样的性能 但由于结果仍然必须使用 lt 操作员
  • java 中的同步 - 正确使用

    我正在构建一个在多进程 线程 中使用的简单程序 我的问题更容易理解 什么时候我必须使用保留字同步 我是否需要在影响骨骼变量的任何方法中使用这个词 我知道我可以将它放在任何非静态的方法上 但我想了解更多 谢谢你 这是代码 public cla