Вопрос про LockSupport.getBlocker (Thread t) в Java - PullRequest
1 голос
/ 24 марта 2020
LockSupport.getBlocker(Thread t)

Возвращает объект блокирования, предоставленный для самого последнего вызова метода парковки, который еще не разблокирован, или ноль, если не заблокирован.

Почему распечатки в этом код выводить разные объекты? Я неправильно понял LockSupport.getBlocker(Thread t)?


public static void main(String[] args) throws InterruptedException {
    Object lock = new Object();
    Thread t1 = new Thread(() -> {
        System.out.println("sub thread lock = " + lock);
        LockSupport.park(new Object());
    });
    t1.start();
    Thread.sleep(5000);
    Object getBlocker = LockSupport.getBlocker(t1);
    System.out.println("main thread blocker = " + getBlocker);
    System.out.println("is blocker same ? " + getBlocker == lock);
    LockSupport.unpark(t1);
    t1.join();
}

Вывод:

sub thread lock = java.lang.Object@6edf6345
main thread blocker = java.lang.Object@77459877
false

Ответы [ 2 ]

2 голосов
/ 24 марта 2020
LockSupport.park(new Object());

Вы паркуетесь с совершенно новым объектом. Парк с lock.

LockSupport.park(lock);
0 голосов
/ 24 марта 2020

Ваше понимание метода LockSupport.getBlocker(Thread t) правильное. Однако, вы, вероятно, ошиблись, потому что вы передали объект, отличный от lock в методе park.

Чтобы ваша проверка вернула true, передайте объект lock в метод park.

LockSupport.park(lock);

Чтобы это работало, вам, возможно, придется сделать объект lock final.

...