想使用线程同步,以保证在同一个时刻只有一个线程能够执行某部分代码。
我使用的是同步代码块。
线程部分代码如下:
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

解决方案 »

  1.   

    private Object obj = new Object();
            @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;
                    }
                }有什么问题?
      

  2.   


    输出结果:
    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.最后一个数更是
      

  3.   

    // private Object obj = new Object();private final Object obj = new Object();
      

  4.   


    额,没有错误!
    我知道我错在哪里了,我把byte[] b=new byte[0]写到run方法里面去了,这样三个线程就是3个不同的锁,同步效果就没了