Java学习-079-多线程12:使用 synchronized 同步方法解决多线程资源同步问题

上篇文章 Java学习-078-多线程11:使用 synchronized 同步代码块解决多线程资源同步问题  中使用同步代码块解决多线程资源同步问题,synchronized 也可修饰方法,通过同步方法也可实现与同步代码块相同的效果。

语法示例:

synchronized 方法返回值 方法名称(参数列表) {
    // 业务逻辑
}

 

源代码示例如下所示:

package com.fanfengping.demo;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Demo05SaleTicketRunnable implements Runnable {
    private int stockTicket;
    private int saleTicket;

    Demo05SaleTicketRunnable() {
        stockTicket = 20;
        saleTicket = 0;
    }

    /**
     * 使用 synchronized 修饰方法体
     */
    private synchronized void sellTicket() {
        if (stockTicket > 0) {
            log.info("Runnable {}:已售票数 {},剩余票数 {}{}", Thread.currentThread().getName(), ++saleTicket, --stockTicket, stockTicket == 0 ? ",停止售票!" : "");
        } else {
            log.info("Runnable {}:已售票数 {},剩余票数 {},停止售票!", Thread.currentThread().getName(), saleTicket, stockTicket);
        }
    }

    @Override
    public void run() {
        log.info("Running Runnable Thread : {}", Thread.currentThread().getName());

        while(stockTicket > 0) {
            sellTicket();
            try {
                // 将 sleep 放在同步代码块外,在售票完成后即释放同步锁,并休眠一会,允许其他窗口继续售票
                Thread.sleep(800);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        log.info("Runnable {} exit", Thread.currentThread().getName());
    }
}

 

测试方法源代码如下所示:

package com.fanfengping.demo;

public class Demo05SaleTicketRunnableTest {
    public static void main(String[] args) {
        Demo05SaleTicketRunnable st = new Demo05SaleTicketRunnable();

        for (int j = 1; j < 6; j++) {
            new Thread(st, "售票窗口 " + j).start();
        }
    }
}

  

程序执行后输出结果如下所示:

[售票窗口 5] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Running Runnable Thread : 售票窗口 5
[售票窗口 3] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Running Runnable Thread : 售票窗口 3
[售票窗口 3] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 3:已售票数 1,剩余票数 19
[售票窗口 5] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 5:已售票数 2,剩余票数 18
[售票窗口 2] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Running Runnable Thread : 售票窗口 2
[售票窗口 4] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Running Runnable Thread : 售票窗口 4
[售票窗口 2] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 2:已售票数 3,剩余票数 17
[售票窗口 1] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Running Runnable Thread : 售票窗口 1
[售票窗口 4] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 4:已售票数 4,剩余票数 16
[售票窗口 1] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 1:已售票数 5,剩余票数 15
[售票窗口 1] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 1:已售票数 6,剩余票数 14
[售票窗口 5] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 5:已售票数 7,剩余票数 13
[售票窗口 2] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 2:已售票数 8,剩余票数 12
[售票窗口 3] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 3:已售票数 9,剩余票数 11
[售票窗口 4] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 4:已售票数 10,剩余票数 10
[售票窗口 4] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 4:已售票数 11,剩余票数 9
[售票窗口 5] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 5:已售票数 12,剩余票数 8
[售票窗口 1] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 1:已售票数 13,剩余票数 7
[售票窗口 2] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 2:已售票数 14,剩余票数 6
[售票窗口 3] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 3:已售票数 15,剩余票数 5
[售票窗口 1] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 1:已售票数 16,剩余票数 4
[售票窗口 5] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 5:已售票数 17,剩余票数 3
[售票窗口 2] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 2:已售票数 18,剩余票数 2
[售票窗口 4] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 4:已售票数 19,剩余票数 1
[售票窗口 3] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 3:已售票数 20,剩余票数 0,停止售票!
[售票窗口 1] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 1 exit
[售票窗口 5] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 5 exit
[售票窗口 3] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 3 exit
[售票窗口 4] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 4 exit
[售票窗口 2] INFO com.fanfengping.demo.Demo05SaleTicketRunnable - Runnable 售票窗口 2 exit

 

posted @ 2021-06-02 22:21  范丰平  Views(112)  Comments(0Edit  收藏  举报