java 多线程3(线程安全)

需求:模拟三个窗口同时买票。

问题1:static 修饰num,只创建一份在内存中,要不就会创建3份。

问题2:线程安全问题。(代码重1的红色字体)

出现的原因:存在两个或两个以上的线程对象,而且线程间共享着一个资源,

      有多个语句操作了共享资源。

解决方式:加个,synchronized,把锁放到出现线程安全问题的地方,当多个线程一起

      来访问时(线程1,线程2,线程3),看谁先强到锁,先抢到的“人”,拿到锁,

      然后把门“锁上”,就执行它自己的,而其余的线程就在“门外”等,直到它出来了,

      这时锁的状态就变成“开”,然后他们三个再继续一起“抢”,循环这一过程。

注意:公共的锁有且只有一把,多了就不能解决问题了。

那么么既然锁这么好用我们是不都要在自己代码中加个“锁”呢?

答:不是的,没有必要的时候是不用加的,否则会降低效率,如:判断锁的“开”和“关“,那也是要消耗时间的。

 

import java.util.Scanner;

public class EX10 {
    public static void main(String[] args) {
    SaleTicket t1 = new SaleTicket("chongkuo 1");
        SaleTicket t2 = new SaleTicket("chongkuo 2");
        SaleTicket t3 = new SaleTicket("chongkuo 3");
        t1.start();
        t2.start();
        t3.start();
    }
}

class SaleTicket extends Thread{
    static int num = 50;
    static Object o = new Object();
    public SaleTicket(String name){
        super(name);
    }

    @Override
    public void run() {
        while(true) {
            synchronized ("锁"){
                if(num > 0){
                    System.out.println(Thread.currentThread().getName() + "售出了第-------- " + num + "号票");
                    try{
                        Thread.sleep(100);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    num--;
                }else{
                    System.out.println("卖完了");
                    break;
                }
            }
        }
    }
}

 

posted @ 2016-08-17 00:35  lifehrx  阅读(190)  评论(0编辑  收藏  举报