Понимание блокировок в JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Понимание блокировок в Java

Сообщение Anonymous »

Я разбираюсь в блокировках в Java, и у меня возникли проблемы с пониманием этой концепции. Вот пример Java-кода с блокировками

Код: Выделить всё

public class LockQ {

class Shared {
static int count = 0;
}

class LockExample implements Runnable {
Lock lock;

public LockExample(Lock lock) {
this.lock = lock;
}

@Override
public void run() {
lock.lock();

for (int i = 0; i < 5; i++) {
System.out.println("Working on count = " + Thread.currentThread().getName());
Shared.count++;
}

lock.unlock();
}
}

public static void main(String[] args) {
LockQ obj = new LockQ();
obj.demo();
}

public void demo() {
Lock lock = new ReentrantLock();

LockExample l1 = new LockExample(lock);
LockExample l2 = new LockExample(lock);
LockExample l3 = new LockExample(lock);

Thread t1 = new Thread(l1);
Thread t2 = new Thread(l2);
Thread t3 = new Thread(l3);

t1.start();
t2.start();
t3.start();

/*
try {
t2.join();
t3.join();
t1.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
*/

System.out.println("Final count value " + Shared.count);
}
}
Вот пример вывода

Код: Выделить всё

Working on count = Thread-0
Working on count = Thread-0
Working on count = Thread-0
Working on count = Thread-0
Working on count = Thread-0
Working on count = Thread-1
Working on count = Thread-1
Working on count = Thread-1
Working on count = Thread-1
Working on count = Thread-1
Working on count = Thread-2
Working on count = Thread-2
Working on count = Thread-2
Working on count = Thread-2
Working on count = Thread-2
Final count value 0
Мое замешательство:
Почему значение счетчика в конце равно 0? Он печатается после всех операторов печати внутри цикла, что означает, что все три потока завершили выполнение. Код работает так, как ожидалось, если операторы соединения раскомментированы, и я вижу

Окончательное значение счетчика 15
в конце

Подробнее здесь: https://stackoverflow.com/questions/792 ... ks-in-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»