class MyThread implements Runnable{
private int ticket=10;
public void run(){
synchronized(this){
for(int i=0;i<100;i++){
if(ticket>0){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖掉第"+ticket--+"张票");
}
}
}
}
}
public class SynchronizedDemo{
public static void main(String args[]){
MyThread mt=new MyThread();
Thread t1=new Thread(mt,"窗口1");
Thread t2=new Thread(mt,"窗口2");
Thread t3=new Thread(mt,"窗口3");
t1.start();
t2.start();
t3.start();
}
}为什么只有一个窗口买票,而不是三个窗口同时买票,求大神分析一下线程同步

解决方案 »

  1.   

    public void run(){
    synchronized(this){
    这你不是加了锁了么。
    锁住了这段代码,其他的线程就没法运行了吧
      

  2.   

    不能把整个循环锁住,只锁住改变ticket数量的代码
      

  3.   

    出现问题的原因是你把整个for循环锁住了。因此在thread1执行完for循环之前,整个线程是锁住的。
    LZ把同步块家到下面这个位置:
    synchronized (this) {
    System.out.println(Thread.currentThread().getName() + "卖掉第"
    + ticket-- + "张票");
    }
      

  4.   

    自己傻缺了。。同步块应该加在if (ticket > 0) {前面
      

  5.   

    你的代码修改为这样子你试一试:
    public void run(){
    for(int i=0;i<100;i++){
    if(ticket>0){
    int tt = 0;
    synchronized(this){
      tt= ticket--;
    }

    try{
    Thread.sleep(1000);
    }catch(InterruptedException e){
    e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+"卖掉第"+ tt +"张票");
    }
    }
    }
      

  6.   

    去掉 synchronized(this)
    ticket 定义改成
    private volatile int ticket=10;
      

  7.   

    下面是我修改后的代码,希望对你有帮助:package zhangming.csdn;class MyThread implements Runnable
    {
    private int ticket=10;
    public void run()
    { for(int i=0;i<10;i++) //建议不要将i的最大值设的太大这样太浪费资源
    {
    //先睡眠,后锁定,以便让其他线程进来
    try
    {
    Thread.sleep(1000);
    }catch(InterruptedException e){e.printStackTrace();}
    //在进行售票时,需要进行锁定
    synchronized(this)
    {
    if(ticket>0)
    {
    System.out.println(Thread.currentThread().getName()+"卖掉第"+ticket--+"张票");
    }
    }
    }
    }
    }
    public class SynchronizedDemo
    {
    public static void main(String args[])
    {
    MyThread mt=new MyThread();
    Thread t1=new Thread(mt,"窗口1");
    Thread t2=new Thread(mt,"窗口2");
    Thread t3=new Thread(mt,"窗口3");
    t1.start();
    t2.start();
    t3.start();
    }
    }
      

  8.   

    仅供参考:class MyThread implements Runnable {
    private int ticket = 10; public void run() {
    while (ticket > 0) {//循环条件
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    synchronized (this) {
    if (ticket > 0) {//避免卖 -1 张票。
    System.out.println(Thread.currentThread().getName() + "卖掉第"
    + ticket-- + "张票");
    } else {
    break;//退出
    }
    }
    }
    }
    }public class SynchronizedDemo {
    public static void main(String args[]) {
    MyThread mt = new MyThread();
    Thread t1 = new Thread(mt, "窗口1");
    Thread t2 = new Thread(mt, "窗口2");
    Thread t3 = new Thread(mt, "窗口3");
    t1.start();
    t2.start();
    t3.start();
    }
    }
      

  9.   

    这个例子在张先祥的视频看过,当时讲得很详细,但由于我刚接触java,所以过目就忘了,哈哈