java线程使用对象锁的概念来保证在线程操作过程中避免其他线程的干扰,但下面的几个例子经实际运行后,运行结果竟然一样?请各位对此感兴趣的大虾探讨一下:
程序源码如下:
public class ThreadExample {
private int j;
public static void main(String args[]) {
Num num = new Num(100);
Inc inc = new Inc(num);
Dec dec = new Dec(num);
for (int i = 0; i < 2; i++) {
Thread t = new Thread(inc);
t.start();
t = new Thread(dec);
t.start();
}
}
}class Num {
private int j;
public Num(int kk) {
j = kk;
} public void inc() { //B.
j++;
System.out.println(Thread.currentThread().getName() + "-inc:" + j);
} public void dec() { //B.
j--;
System.out.println(Thread.currentThread().getName() + "-dec:" + j);
}}class Inc implements Runnable {
private Num num;
public Inc(Num num) {
this.num = num;
} public void run() { //A.
for (int i = 0; i < 10; i++) {
num.inc();
}
}
}class Dec implements Runnable {
private Num num;
public Dec(Num num) {
this.num = num;
} public void run() { //A.
for (int i = 0; i < 10; i++) {
num.dec();
}
}
}
现在分几种情况运行上面的例子:
1、不做任何修改,直接运行;
2、将A处的两个方法都用synchronized修饰,同步后运行;
3、将B处的两个方法都用synchronized修饰,同步后运行;
4、将A、B处的四个方法都用synchronized修饰,同步后运行;
本来以为它们的运行结果不会都一样,可运行结果显示竟然都向下面一样:执行结果:
Thread-0-inc:101
Thread-0-inc:102
Thread-0-inc:103
Thread-0-inc:104
Thread-0-inc:105
Thread-0-inc:106
Thread-0-inc:107
Thread-0-inc:108
Thread-0-inc:109
Thread-0-inc:110Thread-1-dec:109
Thread-1-dec:108
Thread-1-dec:107
Thread-1-dec:106
Thread-1-dec:105
Thread-1-dec:104
Thread-1-dec:103
Thread-1-dec:102
Thread-1-dec:101
Thread-1-dec:100Thread-2-inc:101
Thread-2-inc:102
Thread-2-inc:103
Thread-2-inc:104
Thread-2-inc:105
Thread-2-inc:106
Thread-2-inc:107
Thread-2-inc:108
Thread-2-inc:109Thread-3-dec:108Thread-2-inc:109Thread-3-dec:108
Thread-3-dec:107
Thread-3-dec:106
Thread-3-dec:105
Thread-3-dec:104
Thread-3-dec:103
Thread-3-dec:102
Thread-3-dec:101
Thread-3-dec:100
(注:中间的空白行是为了看起来清楚,人为添加!)难道synchronized同步方法不起作用?
程序源码如下:
public class ThreadExample {
private int j;
public static void main(String args[]) {
Num num = new Num(100);
Inc inc = new Inc(num);
Dec dec = new Dec(num);
for (int i = 0; i < 2; i++) {
Thread t = new Thread(inc);
t.start();
t = new Thread(dec);
t.start();
}
}
}class Num {
private int j;
public Num(int kk) {
j = kk;
} public void inc() { //B.
j++;
System.out.println(Thread.currentThread().getName() + "-inc:" + j);
} public void dec() { //B.
j--;
System.out.println(Thread.currentThread().getName() + "-dec:" + j);
}}class Inc implements Runnable {
private Num num;
public Inc(Num num) {
this.num = num;
} public void run() { //A.
for (int i = 0; i < 10; i++) {
num.inc();
}
}
}class Dec implements Runnable {
private Num num;
public Dec(Num num) {
this.num = num;
} public void run() { //A.
for (int i = 0; i < 10; i++) {
num.dec();
}
}
}
现在分几种情况运行上面的例子:
1、不做任何修改,直接运行;
2、将A处的两个方法都用synchronized修饰,同步后运行;
3、将B处的两个方法都用synchronized修饰,同步后运行;
4、将A、B处的四个方法都用synchronized修饰,同步后运行;
本来以为它们的运行结果不会都一样,可运行结果显示竟然都向下面一样:执行结果:
Thread-0-inc:101
Thread-0-inc:102
Thread-0-inc:103
Thread-0-inc:104
Thread-0-inc:105
Thread-0-inc:106
Thread-0-inc:107
Thread-0-inc:108
Thread-0-inc:109
Thread-0-inc:110Thread-1-dec:109
Thread-1-dec:108
Thread-1-dec:107
Thread-1-dec:106
Thread-1-dec:105
Thread-1-dec:104
Thread-1-dec:103
Thread-1-dec:102
Thread-1-dec:101
Thread-1-dec:100Thread-2-inc:101
Thread-2-inc:102
Thread-2-inc:103
Thread-2-inc:104
Thread-2-inc:105
Thread-2-inc:106
Thread-2-inc:107
Thread-2-inc:108
Thread-2-inc:109Thread-3-dec:108Thread-2-inc:109Thread-3-dec:108
Thread-3-dec:107
Thread-3-dec:106
Thread-3-dec:105
Thread-3-dec:104
Thread-3-dec:103
Thread-3-dec:102
Thread-3-dec:101
Thread-3-dec:100
(注:中间的空白行是为了看起来清楚,人为添加!)难道synchronized同步方法不起作用?
t.start();
t = new Thread(dec);
t.start();这段代码中好像同步的是两个不同的对象,不知道是不是这样???学习中!!!
synchronized 加在A处,表示 同一Dec对象的run(方法)不能同时被两个线程进入, 同样 同一Inc对象的run(方法)不能同时被两个线程进入. 而实际上这段程序中一个线程用了一个Dec对象,另一个线程用了一个Inc对象. synchronized 所加的锁体现不出任何效果
但执行的输出结果看不出锁是否起到作用,Thread-0和Thread-2应该没有同时进入inc(),即使输出上有
Thread-0-inc:107
Thread-2-inc:108
Thread-0-inc:109
这样混杂情况,也可能是Thread-0和Thread-2应该没有同时到达inc(),其中Thread-2被挂起,等待Thread-0出了inc()之后再进去的,所以这些输出都是合法的.