Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / написать кастомнй лок на атомиках. / 16 сообщений из 16, страница 1 из 1
31.10.2015, 12:08
    #39091682
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
был на собеседовании.

Попросили написать лок используя атомики.
Я растерялся и затупил.

Сейчас дома в спокойной обстановке написал:

Код: 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.
52.
public class MyLock {

	AtomicBoolean locked = new AtomicBoolean(false);

	ThreadLocal<Boolean> threadLocal = new ThreadLocal();

	public void lock() {
		while (true) {
			if (locked.compareAndSet(false, true)) {
				threadLocal.set(true);
				return;
			}
		}
	}

	public void unLock() {
		if (threadLocal.get()) {
			locked.compareAndSet(true, false);
		}
	}

}

class Main {

	public static void main(String[] args) {
		MyLock myLock = new MyLock();
		new MyThread(myLock).start();
		new MyThread(myLock).start();
	}
}

class MyThread extends Thread {

	final MyLock myLock;

	MyThread(MyLock myLock) {
		this.myLock = myLock;
	}

	@Override public void run() {
		myLock.lock();
		System.out.println("start - " + Thread.currentThread().getName());
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
		}
		System.out.println("finish - " + Thread.currentThread().getName());
		myLock.unLock();
	}
}




верно?
...
Рейтинг: 0 / 0
31.10.2015, 13:46
    #39091716
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
...
Рейтинг: 0 / 0
31.10.2015, 13:53
    #39091720
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
redwhite90, как я понимаю тебе нужно проверить есть ли поток, который владеет замком (AtomicBoolean).
Если такой поток есть (типа AtomicBoolean == true), то получить currentThread и сравнить с текущим. Если это это другой поток, то вызвать цикл while и ждать. Затем поместить в переменную currentThread текущий поток и выйти. unlock делать в finally блоке.
...
Рейтинг: 0 / 0
31.10.2015, 14:07
    #39091724
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
rdm,

авторто получить currentThread и сравнить с текущим

это пять !!!

Ну я не думаю, что надо закладываться на имплементацию ReentrantLock

не похоже, что она на атомиках
...
Рейтинг: 0 / 0
31.10.2015, 14:08
    #39091725
questioner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
в моей то реализации есть косяки?
...
Рейтинг: 0 / 0
31.10.2015, 14:25
    #39091731
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
questioner, согласен)))
...
Рейтинг: 0 / 0
31.10.2015, 14:27
    #39091732
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
questioner, я говорил про

Код: java
1.
if (Thread.currentThread() != getExclusiveOwnerThread())
...
Рейтинг: 0 / 0
31.10.2015, 14:46
    #39091733
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
rdmquestioner, я говорил про

Код: java
1.
if (Thread.currentThread() != getExclusiveOwnerThread())




я пытаюсь решить у себя эту проблему при помощи ThreadLocal
...
Рейтинг: 0 / 0
01.11.2015, 00:49
    #39091948
dmitriyche
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
redwhite90,

What if MyLock#lock() is invoked from 2+ threads? Which thread will lock it?
...
Рейтинг: 0 / 0
01.11.2015, 13:47
    #39092065
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
dmitriyche,

Кто успел, тот и съел. на 3 потоках проверял.

Но многопоточность это не та тема, которую можно проверить просто запусками большого количества потоков.
...
Рейтинг: 0 / 0
01.11.2015, 13:50
    #39092067
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
на 10 потоках:

Код: java
1.
2.
3.
4.
5.
      public static void main(String[] args) {
		MyLock myLock = new MyLock();
		for (int i=0;i<10;i++)
			new MyThread(myLock).start();
	}


вывод:

авторstart - Thread-0
finish - Thread-0
start - Thread-2
finish - Thread-2
start - Thread-7
finish - Thread-7
start - Thread-1
finish - Thread-1
start - Thread-3
finish - Thread-3
start - Thread-6
finish - Thread-6
start - Thread-9
finish - Thread-9
start - Thread-4
finish - Thread-4
start - Thread-8
finish - Thread-8
start - Thread-5
finish - Thread-5
...
Рейтинг: 0 / 0
02.11.2015, 13:05
    #39092653
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
redwhite90,

А что как один поток, попробует более одного раза захватить блокировку?
...
Рейтинг: 0 / 0
02.11.2015, 22:02
    #39093219
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
Сергей Арсеньев,

сказали, что Reentrant не обязательно
...
Рейтинг: 0 / 0
02.11.2015, 22:07
    #39093223
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
Сергей Арсеньев,

да, конечно, в unlock надо написать

Код: java
1.
threadLocal.set(false);
...
Рейтинг: 0 / 0
03.11.2015, 12:20
    #39093576
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
redwhite90сказали, что Reentrant не обязательно
IMHO "Reentrant не обязательно" - это отлуп по повтору, а не deadlock.
...
Рейтинг: 0 / 0
04.11.2015, 12:23
    #39094360
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написать кастомнй лок на атомиках.
Сергей Арсеньевredwhite90сказали, что Reentrant не обязательно
IMHO "Reentrant не обязательно" - это отлуп по повтору, а не deadlock.

Чот я Вас не понял.

Как тут добиться дедлока?

код main покажите
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / написать кастомнй лок на атомиках. / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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