Я пытаюсь реализовать решение с двумя потоками, используя алгоритм LockOne (взаимоисключающий). Реализуя этот алгоритм, я пытаюсь разработать поток, определяющий мои собственные методы блокировки, но я не получаю желаемого результата. Когда я запускаю программу... все, что я получаю в качестве вывода, это "Thread-0 Locked" и "Thread-1 Locked".. Может кто-нибудь, пожалуйста, дайте мне знать, где я ошибаюсь? мой код приведен ниже
public class Main {
static MyLock lock=null;
static int count=0;
public static void main(String[] args) throws InterruptedException {
Thread[] threads=new Thread[2];
threads[0]=new Thread(new MyThread());
threads[1]=new Thread(new MyThread());
lock=new MyLock();
threads[0].start();
threads[1].start();
threads[0].join();
threads[1].join();
System.out.println(count);
}
}
public class MyLock{
private boolean locked=false;
private String current;
public void lock() {
if(!locked){
locked=true;
current=Thread.currentThread().getName();
}
System.out.println(Thread.currentThread().getName()+" locked");
while(locked && current!=Thread.currentThread().getName());
}
public void unlock() {
System.out.println(Thread.currentThread().getName()+" unlocked");
locked=false;
}
}
public class MyThread implements Runnable{
@Override
public void run() {
int i=1;
while(i<=100){
Main.lock.lock();
Main.count++;
Main.lock.unlock();
i++;
}
}
}
lock()
иunlock()
из разных потоков не возникает никаких отношений. Нет никакой гарантии, что изменения состояния объектаMyLock
одним потоком будут видны другим потокам. - процесс блокировки не является атомарным. - person Igor Melnichenko   schedule 23.01.2018