Я хотел бы решить взаимное исключение с помощью функции Swap, но программа страдает от тупика, и я не знаю почему. Кажется, что проблема возникает, когда поток выполняется два раза подряд.Java - тупик с использованием функции SWAP для решения взаимного исключения
свопа замка логик:
Каждого поток делает использование локальной переменной и совместно переменным. Поток сначала блокирует его local переменная (например, предположим, что значение 1). Когда поток локальная переменная разблокирован (например, предположим, значение 0), она может выполнить критическую секцию, если нить локальная переменная блокируется (например, предположим, значение 1) нить в занят ожидающего (занято ожидание проверяет локальную переменную разблокировку и вызывает свопа функции)
функция подкачки устанавливает локальных переменную к общей значения переменного и функция viceversa.The подкачки должна быть атомарным.
Когда своп потока вызовов, если эти «общие» переменные 0 (разблокировать) после обмена мы имеем, что общих переменная 1 и местных 0. Таким образом, только этот поток может получить доступ к критический раздел нет.
В конце (не более критической секции) нить разблокирует общую переменную.
Главная
public class Mutex {
public static void main(String []args){
LockVar var = new LockVar(0);
ThreadSwap th0 = new ThreadSwap(var);
ThreadSwap th1 = new ThreadSwap(var);
ThreadSwap th2 = new ThreadSwap(var);
th0.start();
th1.start();
th2.start();
}
}
Класс Thread (Логика этого типа мьютекса подчеркивается)
class ThreadSwap extends Thread{
private LockVar shared_var;
public ThreadSwap(LockVar var){
this.shared_var = var;
}
@Override
public void run(){
LockVar local = new LockVar(1);
while(true){
---> local.setVar(1);
---> while(local.getVar() == 1){Synch.SWAP(shared_var, local);}
System.out.println("Thread " + getId() + " exec critical section.");
// Critical section
System.out.println("Thread " + getId() + " is leaving critical section.");
---> shared_var.setVar(0);
}
}
}
функции Обмена
class Synch{
public static synchronized void SWAP(LockVar shared, LockVar local){
int temp = shared.getVar();
shared.setVar(local.getVar());
local.setVar(temp);
}
...
}
Общий вар Класс
class LockVar{
private volatile int var;
public LockVar(int value){
this.var = value;
}
public int getVar(){
return this.var;
}
public void setVar(int value){
this.var=value;
}
}
Что такое ThreadTaS? – user2891462
Каков ожидаемый результат? Каков фактический результат, который вы получаете? Обратите внимание, что вы используете setVar в конце каждого цикла несинхронизированным образом. – user2891462
Извините, что я отредактирую правильный код. – MadDogTannen