Regardless of which API you are using, you will not be able to achieve both thread-safe and loose attachment of array elements in Java.
, . , .
:
: , .
. , , , , , .
, , . , 0 1 , 1 2, , {'a, b, c} {'b, c, a} {' c, a, b}. , .
, :
import java.util.concurrent.atomic.AtomicIntegerArray;
class SyncCharArray {
final private char array [];
final private AtomicIntegerArray locktable;
SyncCharArray (char array[])
{
this.array = array;
this.locktable = new AtomicIntegerArray(array.length);
for (int i = 0;i<array.length;i++) unlock(i);
}
void swap (int idx1, int idx2)
{
if (idx1==idx2) return;
lock(Math.min(idx1,idx2));
lock(Math.max(idx1,idx2));
char tmp = array[idx1];
array [idx1] = array[idx2];
unlock(idx1);
array[idx2] = tmp;
unlock(idx2);
}
private void lock (int idx)
{
while (!locktable.compareAndSet(idx,0,1)) Thread.yield();
}
private void unlock (int idx)
{
locktable.set(idx,0);
}
}
SyncCharArray, , :
char array [] = {'a','b','c','d','e','f'};
SyncCharArray sca = new SyncCharArray(array);
sca.swap(15,3);
, .
UPDATE:
, , , (100+ ), () {} , .