powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / написать кастомнй лок на атомиках.
16 сообщений из 16, страница 1 из 1
написать кастомнй лок на атомиках.
    #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
написать кастомнй лок на атомиках.
    #39091716
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
написать кастомнй лок на атомиках.
    #39091720
rdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90, как я понимаю тебе нужно проверить есть ли поток, который владеет замком (AtomicBoolean).
Если такой поток есть (типа AtomicBoolean == true), то получить currentThread и сравнить с текущим. Если это это другой поток, то вызвать цикл while и ждать. Затем поместить в переменную currentThread текущий поток и выйти. unlock делать в finally блоке.
...
Рейтинг: 0 / 0
написать кастомнй лок на атомиках.
    #39091724
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdm,

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

это пять !!!

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

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

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

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




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

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

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

Но многопоточность это не та тема, которую можно проверить просто запусками большого количества потоков.
...
Рейтинг: 0 / 0
написать кастомнй лок на атомиках.
    #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
написать кастомнй лок на атомиках.
    #39092653
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,

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

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

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

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

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

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

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


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