A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 75100313 高级黑马   /  2013-12-18 06:27  /  1174 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.mth.synchronizedtest;

/*
* 本程序目的:解决卖重复票 还有 负数票的情况
*
*  
* */
public class SynchronizedTest1 implements Runnable {
        private int tickets = -1;

        @Override
        public void run() {
                for (int i = 0; i < 50; i++) {
                        synchronized (this) {
                                if (tickets > 0) {
                                        try {
                                                Thread.sleep(1000);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        System.out.println(Thread.currentThread().getName()
                                                        + "号窗口卖出" + this.tickets-- + "号票");

                                }
                        }
                }
        }

        public static void main(String[] args) {
                SynchronizedTest test = new SynchronizedTest();
                Thread t1 = new Thread(test);
                Thread t2 = new Thread(test);
                Thread t3 = new Thread(test);
                Thread t4 = new Thread(test);
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }

}




评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

8 个回复

正序浏览
零敢 发表于 2013-12-18 14:28
class MyThread implements Runnable{
        private int ticket = 5 ;        // 假设一共有5张票
      ...

十分感谢  嗯
回复 使用道具 举报
零敢 中级黑马 2013-12-18 14:28:14
8#
本帖最后由 零敢 于 2013-12-18 14:33 编辑

class MyThread implements Runnable{
        private int ticket = 5 ;        // 假设一共有5张票
        public void run(){
                for(int i=0;i<100;i++){
                        this.sale() ;        // 调用同步方法
                }
        }
        public synchronized void sale(){        // 声明同步方法
                if(ticket>0){        // 还有票
                        try{
                                Thread.sleep(300) ;        // 加入延迟
                        }catch(InterruptedException e){
                                e.printStackTrace() ;
                        }
                        System.out.println("卖票:ticket = " + ticket-- );
                }

        }
};
public class SyncDemo03{
        public static void main(String args[]){
                MyThread mt = new MyThread() ;        // 定义线程对象
                Thread t1 = new Thread(mt) ;        // 定义Thread对象
                Thread t2 = new Thread(mt) ;        // 定义Thread对象
                Thread t3 = new Thread(mt) ;        // 定义Thread对象
                t1.start() ;
                t2.start() ;
                t3.start() ;
        }
};

你可以试试我这个;;你设置票=-1不知道你是什么意思........
这个应该是原始票数吧;
其实你如果用了同步代码块或者同步方法票数就不会变负数也不会卖重复票

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
我晕 我错了 我也不知道 快捷键写的 我说怎么回事 感谢大伙
回复 使用道具 举报
你定义的线程类是这样SynchronizedTest1
public class SynchronizedTest1 implements Runnable
但是你新建线程对象的时候用的却是SynchronizedTest
SynchronizedTest test = new SynchronizedTest();

新建了不同的线程对象,那么线程就会有不同的贡献数据。所以你的-1在这是不管用的。
你的当前文件目录里肯定有一个Synchronized.class的字节码文件,是你以前编译过的,所以才会执行。
不然这样一般是会报错的哦!以后要细心 ~~

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
tickets = -1的时候你怎么可能卖票呢?除非是你改了之后没保存!
还有你的类名是SynchronizedTest1
应该声明的是类对象 SynchronizedTest1 test = new SynchronizedTest1();
你把这两个地方改一下应该没什么问题!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
你定义的类名是SynchronizedTest1    在下面你创建对象时SynchronizedTest() 明显用的不是这个类   
回复 使用道具 举报
bug了 啊 啊啊啊啊啊 还是我哪里写的不对
回复 使用道具 举报
为什么设置-1还能卖票呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马