Код: Выделить всё
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
Мобильная версия