Java-多线程-线程安全-同步方法

Java-多线程-线程安全-同步方法

  • 在多个线程都在争抢公共资源的时候,可能会出现抢到公共资源后,还没有完成所有操作就被其他线程抢走了,这可能导致程序运行结果不符合我们的意愿的情况
  • 为了解决线程安全的问题,可以在可能出现线程危险的地方整体提取为一个方法,然后使用synchronized修饰该方法,这样这个方法就变成了同步方法,可以解决线程安全问题
  • 但是在使用的时候也要注意,在使用同步代码块的时候,不要多包了代码,不然影响代码的执行效率
  • 示例:
public class BuyTicketThread extends Thread {
    // 使用构造器给线程命名
    public BuyTicketThread(String name) {
        super(name);
    }
    // 一共还有10张机票,使用static修饰的变量才能保障,各子线程之间共用该变量
    private static int ticketNum = 10;

    // 线程主要逻辑,实现各窗口之间抢票
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
                a();
        }
    }
    public static synchronized void a(){ // 加上static保证锁是同一把锁
        if (ticketNum > 0) {
            System.out.println("我在" + Thread.currentThread().getName() + "买到了从西藏到成都的第" + ticketNum-- + "张机票");
        }
    }
}
class Test01 {
    // 这是main方法,实现程序主要逻辑
    public static void main(String[] args) {
        // 创建三个线程对象
        BuyTicketThread t1 = new BuyTicketThread("窗口1");
        BuyTicketThread t2 = new BuyTicketThread("窗口2");
        BuyTicketThread t3 = new BuyTicketThread("窗口3");
        // 启动线程
        t1.start();
        t2.start();
        t3.start();
    }
}
posted @ 2021-01-19 19:32  殃奕  阅读(40)  评论(0编辑  收藏  举报