
同步方法和同步块
发布日期:2021-05-08 02:59:34
浏览次数:20
分类:精选文章
本文共 1339 字,大约阅读时间需要 4 分钟。
Java多线程环境下,由于没有机制保证线程的原子性,可能会导致资源竞争问题。例如在抢票场景中,若多个线程同时操作票务系统,可能会导致票数出现负值,或者钱包中的金额出现负数等异常现象。这种现象表明,Java中的多线程编程需要额外的机制来确保线程的安全性。
解决这一问题的关键在于Java提供的锁机制。锁机制可以确保在多个线程同时访问共享资源时,能够按照一定的规则进行访问,避免数据竞争和资源泄漏等问题。在Java中,锁机制可以通过synchronized关键字来实现。具体来说,synchronized可以锁定当前类(使用public后加上synchronized),或者锁定特定对象(如synchronized(对象){代码块})。前者锁定的是类的所有方法,后者则只锁定特定对象的方法,能够更精确地控制资源的访问。
以下是一个典型的票务系统案例,展示了多线程环境下如何通过锁机制解决抢票问题:
public class UnsafeBuyTicket { public static void main(String[] args) { MyTicket myTicket = new MyTicket(); new Thread(myTicket, "用户1").start(); new Thread(myTicket, "用户2").start(); new Thread(myTicket, "用户3").start(); }}class MyTicket implements Runnable { private int tickets = 10; boolean flag = true; @Override public void run() { while (flag) { try { buy(); } catch (InterruptedException e) { e.printStackTrace(); } } } // 同步方法锁定this对象 private synchronized void buy() throws InterruptedException { while (flag) { if (tickets <= 0) { flag = false; return; } // 模拟延时 Thread.sleep(100); System.out.println(Thread.currentThread().getName() + "抢到了第" + tickets-- + "张票"); } }}
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月05日 05时55分23秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java基础--java内部类
2019-03-05
fastjson 反序列化源码解析
2019-03-05
按位与、或、非、异或总结
2019-03-05
TCP心跳检测包
2019-03-05
01 背包问题
2019-03-05
JVM - 参数配置影响线程数
2019-03-05
idea如何导入一个maven项目
2019-03-05
在 springboot 项目中全局处理异常
2019-03-05
Keil修改Stm32的工程名字
2019-03-05
ILI9341几个重要的命令
2019-03-05
AD如何对原理图进行注释
2019-03-05
力扣:地图分析(多源bfs)
2019-03-05
NC15136: 迷宫
2019-03-05
动态点击a标签
2019-03-05
@RequestBody和@RequestParam
2019-03-05
oracle创建序列语法
2019-03-05
springboot通过控制层跳转页面404
2019-03-05
idea2020 没有 tomcat server
2019-03-05
jq动态修改元素的onclick属性的值
2019-03-05
为什么讨厌所谓仿生AI的说法
2019-03-05