zoukankan      html  css  js  c++  java
  • 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
    我本渺小,但山峰,我一次次绝顶!


    PS:若有错误,敬请告知,不胜感激!
    Copyright @范丰平 版权所有,如需转载请标明本文原始链接出处,严禁商业用途! 我的个人博客链接地址:http://www.cnblogs.com/fengpingfan
  • 相关阅读:
    【focus-lei 】微服务
    queryURLParams
    时间字符串的处理
    str.charAt()与str[]的区别
    数组去重函数封装
    数组去重的几种方法
    splice与slice区别
    变量与属性名的区别
    parseInt parseFloat Number三者转换的方式
    原生js实现选项卡样式切换的几种方式。
  • 原文地址:https://www.cnblogs.com/fengpingfan/p/14709028.html
Copyright © 2011-2022 走看看