多线程的应用

多线程的应用

需求

  • 三个线程,名字分别为“张三”,“李四”,“票贩子”,共同抢100张火车票
  • 每个线程抢到一张票后,都必须休眠500ms,以模拟网络延迟
  • 票贩子只能抢一张
package test;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 * @author ZoyLiaN
 */
public class TicketOffice implements Runnable{
    private int count = 100;  //记录剩余票数
    private int no = 0;  //记录买到第几张票
    private boolean flag = false; //记录是否售完
    public void run(){
        while(true){
            if(!sale()) {break;}   //线程启动后调用run方法,循环调用sale()
        }    
    }
    public synchronized boolean sale(){
        if(count == 0) return false;
        no++;
        count--;
        try {
            Thread.sleep(500);
       	 } catch (InterruptedException e) {
           e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"抢到第"+no+"张票,剩余"+count+"张票!");
        //字符串比较尽量用equals而不是等号呀 〒▽〒
        if("票贩子".equals(Thread.currentThread().getName()))  //票贩子只能抢一张
           {return false;}
        return true;
    }
}

package test;
/**
 * @author ZoyLiaN
 */
public class Test {
    public static void main(String[] args) {
 
        TicketOffice t = new TicketOffice();
        
        Thread t1 = new Thread(t);
        Thread t2= new Thread(t);
        Thread t3 = new Thread(t);
        
        t1.setName("张三");
        t2.setName("李四");
        t3.setName("票贩子");
        t1.start();
        t2.start();
        t3.start();
    }
    
}

总结

本憨憨的main中最先开始是这么写 的

Thread t1 = new Thread(new Ticketoffice());
Thread t2 = new Thread(new Ticketoffice());
Thread t3 = new Thread(new Ticketoffice());

然后发现sale() 函数加不加 synchronized 结果 居然都不同步

后来发现

其实这样写, 实际上是new出了三个对象, 但是, 一个Java对象就有一把锁

所有, 这里有三把锁

所以, 锁不住哇, 这样的三个线程互不干扰, 没法同步

换个理解方式就是, synchronized 锁定的是当前的 特定的 某对象 ,该对象的线程们一个个执行

而这里却是三个对象

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值