Java学习-079-多线程12:使用 synchronized 同步方法解决多线程资源同步问题
2021/6/2 22:50:50
本文主要是介绍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
这篇关于Java学习-079-多线程12:使用 synchronized 同步方法解决多线程资源同步问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南