powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / holdsLock для другого потока
7 сообщений из 7, страница 1 из 1
holdsLock для другого потока
    #37856743
msangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется такой код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
package com.ciklum.pp.msangel;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestThreadLock {
public static void main(String[] args) {
	System.out.println("Hi");
	//  в качестве монитора использую текущий поток - это не принцыпиально но удобно
	ExecutorService pool = Executors.newCachedThreadPool();
	final Thread monitor = Thread.currentThread();
	
	pool.execute(new Runnable() {
		public void run() {
			try {
				Thread.sleep(5l);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			// TODO: how to check - if monitor thread is waiting for our object or for another?
			while(monitor.getState()!=Thread.State.WAITING ){
				// System.out.println("Thread is not locked yet - will wait.");
				try {
					Thread.sleep(50l);
				} catch (InterruptedException e) { e.printStackTrace(); }
			}
			System.out.println("Second thread");
			synchronized (monitor) {
				monitor.notify();				
			}
		}
	});
	System.out.println("start");
	int a = 0;
	for(int i= Integer.MIN_VALUE; i<Integer.MAX_VALUE/10;i++){
		a += i;
	}
	
	System.out.println("end:"+a);

	try {
		synchronized (monitor) {
			monitor.wait();
		}
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	System.out.println("first thread");
	pool.shutdown();
}
}



ну и вопрос - как узнать, что мой поток ждет именно monitor?
...
Рейтинг: 0 / 0
holdsLock для другого потока
    #37856782
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас явно используется переменная monitor. Так и узнать. Или что вы имеете ввиду.
Не стоит использовать сам Thread для synchronize. Создайте отдельный объект для этой цели.
...
Рейтинг: 0 / 0
holdsLock для другого потока
    #37856807
msangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я имел ввиду то, что узнать можно с помощью метода Thread.holdsLock(monitor), но он статичесский и применяется только к текущему потоку. И я не понимаю, как можно сделать что-то такое:
Код: java
1.
2.
3.
4.
5.
6.
			while(monitor.getState()!=Thread.State.WAITING && monitor.holdsLock(monitor)){
				// System.out.println("Thread is not locked yet - will wait.");
				try {
					Thread.sleep(50l);
				} catch (InterruptedException e) { e.printStackTrace(); }
			}


Об том, что сам thread не стоит использоват в качестве потока ятоже не понимаю почему - время его жизни больше чем всех других объектов здесь и он за это время не станет null. Так почему же его не использовать в качестве монитора?
...
Рейтинг: 0 / 0
holdsLock для другого потока
    #37856831
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msangelя имел ввиду то, что узнать можно с помощью метода Thread.holdsLock(monitor), но он статичесский и применяется только к текущему потоку. И я не понимаю, как можно сделать что-то такое:

ThreadMXBean/ThreadInfo/LockInfo для мониторинга за другими потоками.

msangelОб том, что сам thread не стоит использоват в качестве потока ятоже не понимаю почему - время его жизни больше чем всех других объектов здесь и он за это время не станет null. Так почему же его не использовать в качестве монитора?
Инкапсуляция. Thread это публичый и общедоступный в JVM объект. Вы где-нибудь в другом месте кода (большого проекта) по привычке сделаете на нем synchronized и получите DeadLock. Поэтому лучше синхронизироваться по приватным финальным полям, чтобы их видимость совпадала с блоками синхронизации.
...
Рейтинг: 0 / 0
holdsLock для другого потока
    #37856834
msangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"!" перед monitor.holdsLock(monitor) пропустил
...
Рейтинг: 0 / 0
holdsLock для другого потока
    #37856836
msangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ок. спс. я попробую. просто интерестно было, есть ли реализзация этого простыми методами.
...
Рейтинг: 0 / 0
holdsLock для другого потока
    #37856849
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thread.holdsLock() не имеет смысл для других потоков. Так как если поток уснул например на wait, то он уже не держит лока. Т.е. это некоторое мгновенное состояние. Так как нахождение в блокие synchronized всегда стараются минимизировать. Соответсвенно с точки зрения других потоков результат этого метода может стать не актуальным сразу после получение значения. Поэтому он именно так и реализован, что его можно получить только в самом текущем потоке, где значение в данный момент времени всегда актуально.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / holdsLock для другого потока
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]