Просто для практики я хотел реализовать Java-синхронизированное ключевое слово как объект java. Не могли бы вы сказать, что код ниже - хороший дизайн для этого? Я предполагаю, что AtomicReference будет иметь аналогичную производительность AtomicBoolean?Является ли это хорошим дизайном для реализации ключевого слова java synchronized в качестве объекта?
Обновленный код после предложений:
public class SynchronizedBlock implements Runnable{
private final Lock lock;
private final Runnable runnable;
public SynchronizedBlock(Runnable r, Lock l){
runnable = r;
lock = l;
}
public void run() {
try {
while(!lock.compareAndSet(false, true)){
Thread.sleep(100);
}
runnable.run();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
public class Lock {
private final AtomicReference<Boolean> locked = new AtomicReference<Boolean>(false);
public boolean compareAndSet(boolean expected, boolean update){
return locked.compareAndSet(expected, update);
}
public boolean isLocked(){
return locked.get();
}
public void unlock(){
locked.set(false);
}
}
@Test
public void test() {
final SynchronizedBlock sb = new SynchronizedBlock(new Runnable(){
public void run() {
x++;
System.out.println(x);
}
}, new Lock());
Runnable r1 = new Runnable(){
int c = 0;
public void run() {
while(c<10){
sb.run();
c++;
}
}
};
Runnable r2 = new Runnable(){
int c = 0;
public void run() {
while(c<10){
sb.run();
c++;
}
}
};
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
while (t1.isAlive() && t2.isAlive()){
}
assertEquals(20,x);
}
Использование Thread.sleep() для этой задачи сильно обескуражено. –
Не могли бы вы объяснить, почему это? – newlogic
он приносит ненужную задержку. Вместо этого используйте http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html. –