Я новичок в Computer Science, и я читаю книгу, в которой представлены потоки и мьютексы. Я пробовал программировать мьютекс в Java, который, кажется, работает большую часть времени, но каждый так часто не будет.Программирование мьютексов в Java
В моем коде критический раздел добавляет числа от 1 до 10 к статической переменной j, что приводит к 55 (если j начинается с 0). Если я запускаю три потока одновременно через критический раздел, я получаю случайные конечные значения j, что имеет смысл.
Но с мьютексом ниже, большую часть времени я получаю конечное значение j 165 (55 * 3), которое я хочу, но иногда я получаю случайные значения j. Может ли кто-нибудь взглянуть на мой код и посмотреть, что происходит? Благодаря!
public class Mythread extends Thread {
private static int j = 0;
private static int mutex = 0; // Initial value of the mutex is 0;
@Override
public void run() {
while (test_and_set(mutex) == 1) {
// wait here if mutex is 1
System.out.println("Thread waiting..");
}
for (int i = 1; i <= 10; i++) { // Start of Critical section
j += i; //
}
System.out.println(j); // End of Critical section
// Should add on 55 to j if one thread is running through the CS
mutex = 0; // Thread that has finished the CS sets the mutex to 0.
}
public static int test_and_set(int oldMutexValue) {
if (mutex == 0) {
mutex = 1;
}
return oldMutexValue;
}
}
public class Test1 {
public static void main(String[] args) {
Mythread thread1 = new Mythread();
Mythread thread2 = new Mythread();
Mythread thread3 = new Mythread();
thread1.start();
thread2.start();
thread3.start();
}
}
Ваши критические разделы не защищены какой-либо синхронизацией. –
@MarkW 'volatile' не помогло бы в' test_and_set'. Действие не является атомарным. –
Хороший звонок @SotiriosDelimanolis –