Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / holdsLock для другого потока / 7 сообщений из 7, страница 1 из 1
27.06.2012, 12:43:27
    #37856743
msangel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
holdsLock для другого потока
Имеется такой код:
Код: 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
27.06.2012, 12:55:48
    #37856782
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
holdsLock для другого потока
у вас явно используется переменная monitor. Так и узнать. Или что вы имеете ввиду.
Не стоит использовать сам Thread для synchronize. Создайте отдельный объект для этой цели.
...
Рейтинг: 0 / 0
27.06.2012, 13:03:53
    #37856807
msangel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
holdsLock для другого потока
я имел ввиду то, что узнать можно с помощью метода 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
27.06.2012, 13:12:49
    #37856831
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
holdsLock для другого потока
msangelя имел ввиду то, что узнать можно с помощью метода Thread.holdsLock(monitor), но он статичесский и применяется только к текущему потоку. И я не понимаю, как можно сделать что-то такое:

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

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


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