为了账号安全,请及时绑定邮箱和手机立即绑定

线程安全对象数组

线程安全对象数组

富国沪深 2022-06-30 18:36:46
我在 Java 中使用二维数组。但是现在,我想将这个类用于多线程。我怎样才能做到这一点?我知道如何执行线程安全功能(添加同步关键字)。如果同时触发 clear 和 getItem 函数会发生什么?在这种情况下,我该如何做线程安全的实例?public class ThreadSafeArray {    int ROW_MAX_COUNT = 1024;    int rowCount = 0;    int counterForRow = 0;    private Object [][] objInstances = new Object[ROW_MAX_COUNT][];    public synchronized void addItem(Object obj) {        if(counterForRow == ROW_MAX_COUNT) {            objInstances[++rowCount] = new Object[ROW_MAX_COUNT];            counterForRow = 0;        }        objInstances[rowCount][counterForRow++] = obj;    }    public synchronized  void clear() {        objInstances = new Object[ROW_MAX_COUNT][];        rowCount = 0;        counterForRow = 0;    }    public synchronized Object getItem(int index) {        int row = index / ROW_MAX_COUNT;        int column = index % ROW_MAX_COUNT;        if((row <= rowCount) && (column <= counterForRow)) {            return objInstances[row][column];        }        return null;    }}
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

在您的代码中,clear并且getItem是实例方法。将同步放在实例方法上意味着线程必须在调用该方法的对象实例上获取锁(“内在锁”),然后线程才能开始执行该方法中的任何代码。

使实例方法同步有两个效果(来自java指南):

  • 首先,同一对象上的同步方法的两次调用不可能交错。当一个线程正在为一个对象执行同步方法时,所有其他为同一对象调用同步方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。

  • 其次,当同步方法退出时,它会自动与任何后续对同一对象的同步方法调用建立起之前的关系。这保证了对象状态的更改对所有线程都是可见的。

因此,对于这两种方法,您的类已经是线程安全的。


查看完整回答
反对 回复 2022-06-30
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

如果同时触发 clear 和 getItem 函数会发生什么?

一个会等到另一个完成。

在这种情况下,我该如何做线程安全的实例?

它已经是线程安全的。



查看完整回答
反对 回复 2022-06-30
  • 2 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信