首页 > 其他分享 >解决线程安全方法2:同步方法

解决线程安全方法2:同步方法

时间:2022-12-22 16:44:08浏览次数:38  
标签:10 同步 线程 ticketNum 方法 public

【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

相关文章