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
  • 相关阅读:
    PAT (Advanced Level) 1080. Graduate Admission (30)
    PAT (Advanced Level) 1079. Total Sales of Supply Chain (25)
    PAT (Advanced Level) 1078. Hashing (25)
    PAT (Advanced Level) 1077. Kuchiguse (20)
    PAT (Advanced Level) 1076. Forwards on Weibo (30)
    PAT (Advanced Level) 1075. PAT Judge (25)
    PAT (Advanced Level) 1074. Reversing Linked List (25)
    PAT (Advanced Level) 1073. Scientific Notation (20)
    PAT (Advanced Level) 1072. Gas Station (30)
    PAT (Advanced Level) 1071. Speech Patterns (25)
  • 原文地址:https://www.cnblogs.com/fengpingfan/p/14709028.html
Copyright © 2011-2022 走看看