public class A { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread1 td=new Thread1();
new Thread(td).start();
new Thread(td).start();
new Thread(td).start(); }}class Thread1 implements Runnable {
private int i=5; @Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized(this){
if(i>0 && i!=0)
{
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" yunxin "+(i--)+" ci");
}
}



}

}
Thread-1 yunxin 5 ci
Thread-2 yunxin 4 ci
Thread-2 yunxin 3 ci
Thread-2 yunxin 2 ci
Thread-2 yunxin 1 ci线程,每次出的结果都不同 这个正常,但是我感觉应该都是同一个线程的5,4,3,2,1,不应该有上面的结果
还有问下,private 的i,每个线程都是公用的i,当Thread-1做好了i=5之后,this的锁还是应该在Thread-1上面的,为什么紧接着Thread-2就能用了呢 ?此时锁不是应该在Thread-1上,只到它5次完成后,锁才能被释放 给其他线程用..

解决方案 »

  1.   

    那怎么写,才能做到线程间都互斥??
    synchronized(this){的意思不是,
    把当前对象的锁放在Thread-1上面的?那应该怎么理解synchronized(this)呢
      

  2.   

    synchronized(this)当前对象就是当前的Thread1对象。
    new Thread(td).start();
    new Thread(td).start();
    new Thread(td).start();
    3个Thread1对象,每个线程都在自己这个对象上加锁,互不影响。可以通过参数传一个公共对象,或者使用唯一的对象,比如利用字符串的性质使用synchronized("abc"),
    或者synchronized(Thread1.class)等等
      

  3.   

    其实, private int i=5;
    所有的线程都是一起共用的 那我这么写可以么:synchronized(i)?还有问下,一个类里面的成员变量,各个对象都是共用的么?是不是public的,就各个对象单独使用的?
      

  4.   

    那我这么写可以么:synchronized(i)? 
      

  5.   

    它只有一个Thread1对象好伐.这个this是同一个对象.
    问题的关键在于lz写的不对.synchronized(this)应该写在While外面.
    LZ这样写在同步块完成到进入下一个循环前这段时间,其他线程可以抢占
      

  6.   

    哎..我也这么觉得啊  同感!!还有问下,一个类里面的成员变量,各个对象都是共用的么?是不是public的,就各个对象单独使用的?
      

  7.   

    只要不是static的就是单独使用的.
      

  8.   

    http://topic.csdn.net/u/20091214/10/628c1556-c6a3-4163-b5ff-50cf2ad3cb97.html?31226
      

  9.   

    当Thread-1做好了i=5之后,this的锁还是应该在Thread-1上面的,为什么紧接着Thread-2就能用了呢
    线程sleep了,锁就释放了,其他都问题就都迎刃而解了吧?
      

  10.   

    7楼说的对,是while要写synchronized(this)里面。
    楼上的,sleep是阻塞,不释放锁。
    API:
    sleep
    public static void sleep(long millis)throws InterruptedException
    在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。该线程不丢失任何监视器的所属权。
      

  11.   

    举个例子
    楼主你写的代码好比,有个mm,现在在你这里,然后你去草场跑一圈,回来后你用绳子绑住她,逼她亲你一下,然后解开绳子,你再去跑一圈
    可是你去跑的时候绳子已经解开了,mm随时会走掉啊
    你需要做的就是,在你跑圈(while)的时候,也绑住她,那就可以了
      

  12.   

    楼主看来对线程还不是很熟悉啊
    只要把你的 while(true){ synchronized(this){
    改成   synchronized(this){ while(true){ 
    就是楼主“但是我感觉应该都是同一个线程的5,4,3,2,1 ” 的效果了