我在Java中使用二维数组。但是现在,我想将这个类用于多线程。我怎样才能做到这一点?
我知道如何进行线程安全功能(添加synchronized关键字)。如果同时触发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;
}
}
在你的代码中,clear
and和getItem
是实例方法。将synchronized同步放在实例方法上意味着线程必须获取在该线程可以开始执行该方法中的任何代码之前调用该方法的对象实例上的锁(“内部锁定”)。
使实例方法同步有两个效果(来自java指南):
- 首先,对同一对象的两个同步方法的调用不可能进行交错。当一个线程正在为对象执行同步方法时,所有其他线程调用同一对象的同步方法(暂停执行)直到第一个线程完成对象。
- 其次,当同步方法退出时,它会自动与同一对象的同步方法的任何后续调用建立先发生关系。这可以保证对所有线程都可以看到对象状态的更改。
因此,您的类对于这两种方法已经是线程安全的。
如果同时触发clear和getItem函数会发生什么?
人们会等到另一个人完成。
如何为这种情况做线程安全实例?
它已经是线程安全的。