import java.util.concurrent.*;
import java.util.concurrent.locks.*;
public class MaiPiao implements Runnable{
 private static int ticket = 100;
 synchronized public void get()
 {
  while(ticket > 0)
{
Thread.yield();
System.out.println (Thread.currentThread().getName() + " : "+ticket);
ticket = ticket - 1;
}
 }
public void run()
{
get();
}  
public static void main(String[] args) {
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
new Thread(new MaiPiao()).start();
}
}为什么还能打印出-1,-2来
还有用lock也不对Lock lock = new ReentrantLock();
lock.lock();
.........
lock.unlock();

解决方案 »

  1.   

         肯定是synchronized没加对位置,明天给你答案,现在要下班了,88
      

  2.   

    出现-1,-2是yield()方法引起的,由于会暂时停止当前的线程
    所以当ticket=0的时候还有没跑干净的线程
    而synchronized修饰这个方法和-1,-2一点关系都没有
    synchronized修饰后只是可以保证ticket不会出现重复的值
    所以要充分理解yield()这个方法
      

  3.   

    synchronized中的ticket 变动时其他线程的ticket变动了吗?
      

  4.   

    用lock是没有问题得。import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;public class MaiPiao implements Runnable {
    private static Integer ticket = 100;
    static Lock lock = new ReentrantLock();

    public void get() {
    while (ticket > 0) {
    lock.lock();
    //synchronized(ticket) {

    System.out.println(Thread.currentThread().getName() + " : "
    + ticket);
    ticket = ticket - 1;
    //}
    lock.unlock();
    }
    } public void run() {
    get();
    } public static void main(String[] args) {
    new Thread(new MaiPiao()).start();
    new Thread(new MaiPiao()).start();
    new Thread(new MaiPiao()).start();
    new Thread(new MaiPiao()).start();
    }
    }
      

  5.   

    我发现用synchronized关键字的时候,如果同不代码段对锁住得对象进行操作的话,比如此例
    synchronized(ticket)
    这样得不到预想得效果,而要是对其他对象进行锁住却能运行得很好这是为何?
      

  6.   

    还是有问题哦  我刚刚运行啦 出现了-1;你加入Thread.yield();能看的更清楚
      

  7.   

    我知道怎么错啦 
    new Thread(new MaiPiao()).start();
    new Thread(new MaiPiao()).start();
    new Thread(new MaiPiao()).start();
    new Thread(new MaiPiao()).start();
    应该这样
    MaiPiao mp = new MaiPiao();
    new Thread(mp).start();
    new Thread(mp).start();
    new Thread(mp).start();
    new Thread(mp).start();
      

  8.   

    public class MaiPiao implements Runnable {
    public static int ticket = 100;
    public  void run() {

    while (ticket > 0) {
    try{

    Thread.sleep(1000);//
    //Thread.yield(); 两个都可以
    }catch(InterruptedException ee){
    ee.printStackTrace();
    }

    synchronized(this){
    if(ticket>0){
    System.out.println(Thread.currentThread().getName() + " : "
    + ticket);
    ticket-=1;
    }
    }
    } } public static void main(String[] args) {
    MaiPiao mp = new MaiPiao();
    new Thread(mp).start();
    new Thread(mp).start();
    new Thread(mp).start();
    new Thread(mp).start(); 
    //new Thread(new MaiPiao()).start();
    }
    }