想使用线程同步,以保证在同一个时刻只有一个线程能够执行某部分代码。
我使用的是同步代码块。
线程部分代码如下:
class MyThread implements Runnable{ @Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized (this){
if(a>0){
System.out.println(a+" "+Thread.currentThread().toString());
a--;
}
else break;
}
}
}
}创建和启动线程部分代码如下:
MyThread tt=new MyThread();
Thread t1=new Thread(tt);
t1.setName("thread 1");
Thread t2=new Thread(tt);
t2.setName("thread 2");
Thread t3=new Thread(tt);
t3.setName("thread 3");
t1.start();
t2.start();
t3.start();
我的程序达到了预定效果。
但是我很郁闷,原来学的时候synchronized (this)这个地方填上任何对象都可以,但是今天调试的时候却发现只能填this ,填一个普通的对象无法达到线程同步的效果。(即输出结果里面a值有相同的!!!这可是线程同步正要解决的问题啊!!!)threadsynchronized
我使用的是同步代码块。
线程部分代码如下:
class MyThread implements Runnable{ @Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized (this){
if(a>0){
System.out.println(a+" "+Thread.currentThread().toString());
a--;
}
else break;
}
}
}
}创建和启动线程部分代码如下:
MyThread tt=new MyThread();
Thread t1=new Thread(tt);
t1.setName("thread 1");
Thread t2=new Thread(tt);
t2.setName("thread 2");
Thread t3=new Thread(tt);
t3.setName("thread 3");
t1.start();
t2.start();
t3.start();
我的程序达到了预定效果。
但是我很郁闷,原来学的时候synchronized (this)这个地方填上任何对象都可以,但是今天调试的时候却发现只能填this ,填一个普通的对象无法达到线程同步的效果。(即输出结果里面a值有相同的!!!这可是线程同步正要解决的问题啊!!!)threadsynchronized
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
synchronized (obj) {
if (a > 0) {
System.out.println(a + " " + Thread.currentThread().toString());
a--;
} else
break;
}
}有什么问题?
输出结果:
100 Thread[thread 1,5,main]
99 Thread[thread 1,5,main]
98 Thread[thread 1,5,main]
97 Thread[thread 1,5,main]
96 Thread[thread 1,5,main]
95 Thread[thread 1,5,main]
94 Thread[thread 1,5,main]
93 Thread[thread 1,5,main]
92 Thread[thread 1,5,main]
91 Thread[thread 1,5,main]
90 Thread[thread 1,5,main]
89 Thread[thread 1,5,main]
88 Thread[thread 1,5,main]
87 Thread[thread 1,5,main]
86 Thread[thread 1,5,main]
85 Thread[thread 1,5,main]
84 Thread[thread 1,5,main]
83 Thread[thread 1,5,main]
82 Thread[thread 1,5,main]
81 Thread[thread 1,5,main]
80 Thread[thread 1,5,main]
79 Thread[thread 1,5,main]
78 Thread[thread 1,5,main]
77 Thread[thread 1,5,main]
76 Thread[thread 1,5,main]
79 Thread[thread 2,5,main]
74 Thread[thread 2,5,main]
73 Thread[thread 2,5,main]
72 Thread[thread 2,5,main]
71 Thread[thread 2,5,main]
70 Thread[thread 2,5,main]
69 Thread[thread 2,5,main]
68 Thread[thread 2,5,main]
67 Thread[thread 2,5,main]
66 Thread[thread 2,5,main]
65 Thread[thread 2,5,main]
64 Thread[thread 2,5,main]
63 Thread[thread 2,5,main]
62 Thread[thread 2,5,main]
61 Thread[thread 2,5,main]
60 Thread[thread 2,5,main]
59 Thread[thread 2,5,main]
58 Thread[thread 2,5,main]
57 Thread[thread 2,5,main]
56 Thread[thread 2,5,main]
55 Thread[thread 2,5,main]
54 Thread[thread 2,5,main]
53 Thread[thread 2,5,main]
52 Thread[thread 2,5,main]
51 Thread[thread 2,5,main]
50 Thread[thread 2,5,main]
49 Thread[thread 2,5,main]
48 Thread[thread 2,5,main]
47 Thread[thread 2,5,main]
46 Thread[thread 2,5,main]
45 Thread[thread 2,5,main]
44 Thread[thread 2,5,main]
43 Thread[thread 2,5,main]
42 Thread[thread 2,5,main]
41 Thread[thread 2,5,main]
40 Thread[thread 2,5,main]
39 Thread[thread 2,5,main]
38 Thread[thread 2,5,main]
37 Thread[thread 2,5,main]
36 Thread[thread 2,5,main]
35 Thread[thread 2,5,main]
34 Thread[thread 2,5,main]
33 Thread[thread 2,5,main]
32 Thread[thread 2,5,main]
31 Thread[thread 2,5,main]
30 Thread[thread 2,5,main]
29 Thread[thread 2,5,main]
28 Thread[thread 2,5,main]
27 Thread[thread 2,5,main]
26 Thread[thread 2,5,main]
25 Thread[thread 2,5,main]
24 Thread[thread 2,5,main]
23 Thread[thread 2,5,main]
22 Thread[thread 2,5,main]
21 Thread[thread 2,5,main]
20 Thread[thread 2,5,main]
19 Thread[thread 2,5,main]
18 Thread[thread 2,5,main]
17 Thread[thread 2,5,main]
16 Thread[thread 2,5,main]
15 Thread[thread 2,5,main]
14 Thread[thread 2,5,main]
13 Thread[thread 2,5,main]
12 Thread[thread 2,5,main]
11 Thread[thread 2,5,main]
10 Thread[thread 2,5,main]
9 Thread[thread 2,5,main]
8 Thread[thread 2,5,main]
7 Thread[thread 2,5,main]
6 Thread[thread 2,5,main]
5 Thread[thread 2,5,main]
4 Thread[thread 2,5,main]
3 Thread[thread 2,5,main]
2 Thread[thread 2,5,main]
1 Thread[thread 2,5,main]
75 Thread[thread 1,5,main]很严重的问题:
1.有重复的(比如有两个79)
2.最后一个数更是
额,没有错误!
我知道我错在哪里了,我把byte[] b=new byte[0]写到run方法里面去了,这样三个线程就是3个不同的锁,同步效果就没了