直行到这一点,我已经做出了代码在Java测试并发性,使用同步方法:
码:
public class ThreadTraining {
public static class Value {
private static int value;
public static synchronized void Add() {
value++;
}
public static synchronized void Sub() {
value--;
}
public static synchronized int Get() {
return value;
}
}
public static class AddT implements Runnable {
public static String name;
public AddT(String n) {
name = n;
}
@Override
public void run() {
while (Value.Get() < 100) {
int prev = Value.Get();
Value.Add();
System.out.println("[" + name + "] - changed value from " + prev + " to " + Value.Get());
}
}
}
public static class SubT implements Runnable {
public static String name;
public SubT(String n) {
name = n;
}
@Override
public void run() {
while (Value.Get() > (-100)) {
int prev = Value.Get();
Value.Sub();
System.out.println("[" + name + "] - changed value from " + prev + " to " + Value.Get());
}
}
}
public static void main(String[] args) {
Thread threads[] = new Thread[3];
for (int i = 0; i < 4; i++) {
if (i % 2 == 0) {
threads[i] = new Thread(new AddT("Adder - Thread #" + i));
} else {
threads[i] = new Thread(new SubT("Subtractor - Thread #" + i));
}
threads[i].start();
}
}
}
此代码,坚韧,具有尽管不可靠的执行力“这是不可能的同一对象,以交错的同步方法两个调用。” (来源: Oracle的并发教程- synchronized方法 ),使输出是不可靠的,如以下内容:(注意,在输出中任何非patternful改变了“......”字里行间表示, 不仅是不可靠的行为 )
-----[Thread #0 - Adder] has been created!
=====[Thread #0 - Adder] has been started!
-----[Thread #1 - Subtractor] has been created!
[Thread #0 - Adder] - changed value from 0 to 1
[Thread #0 - Adder] - changed value from 1 to 2
[Thread #0 - Adder] - changed value from 2 to 3
...\*goes on, adding as expected, for some lines*\
[Thread #0 - Adder] - changed value from 83 to 84
[Thread #0 - Adder] - changed value from 84 to 85
-----[Thread #2 - Adder] has been created!
=====[Thread #1 - Subtractor] has been started!
[Thread #0 - Adder] - changed value from 85 to 86
[Thread #1 - Subtractor] - changed value from 86 to 85
[Thread #1 - Subtractor] - changed value from 86 to 85
[Thread #1 - Subtractor] - changed value from 85 to 84
...\*goes on, subtracting as expected, for some lines*\
[Thread #1 - Subtractor] - changed value from -98 to -99
[Thread #1 - Subtractor] - changed value from -99 to -100 \*This thread ends here, as it reaches the state where (value>(-100))==false*\
=====[Thread #2 - Adder] has been started!
[Thread #2 - Adder] - changed value from -100 to -99
[Thread #2 - Adder] - changed value from -99 to -98
[Thread #2 - Adder] - changed value from -98 to -97
...\*goes on as expected...*\
[Thread #2 - Adder] - changed value from -67 to -66
[Thread #2 - Adder] - changed value from -66 to -65
-----[Thread #3 - Subtractor] has been created!
=====[Thread #3 - Subtractor] has been started!
[Thread #3 - Subtractor] - changed value from -65 to -66
[Thread #3 - Subtractor] - changed value from -66 to -67
...\*goes on as expected...*\
[Thread #3 - Subtractor] - changed value from -71 to -72
[Thread #3 - Subtractor] - changed value from -72 to -73 \*NOTE: From -73 it goes to -74, without a Subtractor-action in between! WTF???*\
[Thread #2 - Adder] - changed value from -74 to -73
[Thread #2 - Adder] - changed value from -73 to -72
...\*goes on as expected...*\
[Thread #2 - Adder] - changed value from 98 to 99
[Thread #2 - Adder] - changed value from 99 to 100 \*This adder ends here, adder thread #0 probably ends after next line...but not before doing something crazy!*\
[Thread #0 - Adder] - changed value from 85 to 86 \*What the hell are these values doing here? Oh wait, next lines is...*\
[Thread #3 - Subtractor] - changed value from -73 to -47\*...Holy mother of god!*\
[Thread #3 - Subtractor] - changed value from 100 to 99
[Thread #3 - Subtractor] - changed value from 99 to 98
...
[Thread #3 - Subtractor] - changed value from -98 to -99
[Thread #3 - Subtractor] - changed value from -99 to -100 \*The logical nightmare is finally over.*\
是采用同步方法不可靠? 或者是执行错了吗? (如果是这样,有什么不好呢?以及如何解决的呢?)