【1】代码展示:
package com.msb.test03; import sun.security.krb5.internal.Ticket; /** * @author : liu * 日期:10:38:04 * 描述:IntelliJ IDEA * 版本:1.0 */ public class BuyTicketThread implements Runnable{ int ticketNum=10; @Override public void run() { for (int i = 1; i < 100; i++) { buyTicket(); } } public synchronized void buyTicket(){//锁住的是this if (ticketNum>0){ System.out.println("我在"+Thread.currentThread().getName()+"买到了火车票:"+ticketNum--); } } }
package com.msb.test01; /** * @author : liu * 日期:08:35:19 * 描述:IntelliJ IDEA * 版本:1.0 */ public class BuyTicketThread extends Thread{ public BuyTicketThread() { } public BuyTicketThread(String name){ super(name); } //一共10张票 static int ticketNum=10;//多个对象共享10张票 //每个窗口都是一个线程对象:每个对象执行的代码存入run方法中 @Override public void run() { for (int i = 1; i <= 100; i++) { buyTicket(); } } public static synchronized void buyTicket(){//用static 修饰 锁住的 同步监视器:BuyTicketThread.class if (ticketNum>0){//对票数进行判断,票数大于零我们才抢票 System.out.println(Thread.currentThread().getName()+"我买到了从北京到哈尔滨的第" + ticketNum-- + "火车票"); } } }
【2】总结:
总结1:
多线程在争抢资源,就要实现线程的同步(就要进行枷锁,并且这个锁必须是共享的,必须是唯一的)。
咱们的锁一般都是引用数据类型。
目的:解决了线程安全问题。
总结2:
(1)不要将run()定义为同步方法
(2)非静态同步方法的同步监视器是this
静态同步方法的见识其实 类名.class字节码信息对象
(3)同步代码块的效率要高于同步方法
原因:同步方法是将线程挡在了方法的外部,而同步代码块锁将线程挡在了代码块的外部,但是却是方法的内部
(4)同步方法的锁是this,一旦锁住一个方法,就锁住了所有的同步方法;同步代码块只是锁住使用该同步监视器的代码块,而没有锁住使用其他监视器的代码块
标签:10,同步,线程,ticketNum,方法,public From: https://www.cnblogs.com/jeldp/p/16999090.html