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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 新手ing 中级黑马   /  2015-7-16 22:04  /  374 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1、看一个卖票例子
需求:100张票,写一个多线程卖票的程序。
public class Demo1 {
    public static void main(String[] args) {
        ticket t = new ticket();
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);
        Thread t4 = new Thread(t);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }

}
class ticket implements Runnable{
    private int tickets = 100;
    boolean more = true;
    public void run() {
        while (more) {
            if (tickets > 0) {
                System.out.println(Thread.currentThread().getName()
                        + "...sale:" + tickets--);
            }else {
                more = false;
            }
        }
    }
}
以上程序会出现一个问题:比如还剩下1张票,0线程进来,刚判断完,时间片轮转结束,1线程进来,刚判断完,时间片轮转结束,2线程进来,时间片轮转结束,3线程进来时间片轮转结束,现在4个进程都处于可执行状态,等待处理器调度。0线程获得CPU执行权,打印ticket=1;接着1线程打印ticket=0.接着2线程打印ticket=-1;接着3线程打印ticket=-2;出现问题了。
当多线程操作共享数据,一个线程还未执行完,另一个线程进来,破坏了线程的完整性。
引入锁机制  同步代码块 Object锁。
public class Demo2 {
    public static void main(String[] args) {
        ticket t = new ticket();
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);
        Thread t4 = new Thread(t);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }

}

class ticket implements Runnable {
    private int tickets = 100;
    boolean more = true;
    Object obj  = new Object();
    public void run() {
       synchronized (obj) {
            while (more) {
                if (tickets > 0) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()
                            + "...sale:" + tickets--);
                } else {
                    more = false;
                }
            }
        }
    }
}
同步函数解决同步问题
public class Demo2 {
    public static void main(String[] args) {
        ticket t = new ticket();
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);
        Thread t4 = new Thread(t);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }

}

class ticket implements Runnable {
    private int tickets = 100;
    boolean more = true;
    public synchronized void run() {
        while (more) {
            if (tickets > 0) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()
                        + "...sale:" + tickets--);
            } else {
                more = false;
            }
        }
    }
}




2 个回复

倒序浏览
写的不错
回复 使用道具 举报
谢谢分享!学习了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马