当前位置: 首页 > news >正文

Java中synchronized基本介绍和细节讨论。使用Synchronized来解决售票超卖问题

基本介绍

线程同步机制:在多线程编程下,一些敏感数据不允许被多个现在在同一时刻访问,此时就使用同步访问机制,保证数据在任何同一时刻最多只有一个进程访问,以保证数据的完整性。(即:当有一个线程在对内存操作时,其他的线程都不允许对这个内存地址进行操作,指代该线程完成操作,其他的线程才能对内存地址进行操作

细节讨论

  1. 关键字synchronized来与对象的互斥锁联系。当某个对象来用synchronized修饰时,表明该对象在任何一时刻只能由一个线程访问
  2. 同步的局限性:导致程序的执行效率低,因为同一时刻只能执行一个线程
  3. sychronized可以修饰方法也可以修饰代码块,分别称为同步方法和同步代码块。一般情况下建议使用同步代码块,因为这样的效率要高一些
  4. 同步方法(非静态)的锁对象可以是this,也可以是其他对象(要求是同一个对象)
  5. 同步方法(静态的)的锁对象是当前类本身

使用synchronized来处理售票时线程同步的问题:
代码:

public class Threads {public static void main(String[] args) {//会出现票超卖现象,原因:当我们还有1张票时,可能一下子来了2个线程,此时判断是否<=0时都不小于,所以继续往下执行卖票,导致票超卖现象Windows windows = new Windows();//同一个对象Thread thread1 = new Thread(windows);thread1.setName("窗口1");//设置线程的名字			Thread thread2 = new Thread(windows);thread2.setName("窗口1");Thread thread3 = new Thread(windows);thread3.setName("窗口3");thread1.start();thread2.start();thread3.start();}
}class Windows implements Runnable {private static int tickets = 100;//共享100张票private /*static*/ Boolean loop = true;//控制run方法变量public /*static*/ void sell() {//同步方法
//        Object object = new Object();synchronized (/*当方法为静态时锁对象是当前类本身为:Windows.class*/this/*当为非静态方法时也可以为object,因为object是这个类的对象,是同一个对象*/) {if (tickets <= 0) {System.out.println("没票了");loop = false;return;}try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "卖了一张票,还剩" + (--tickets));}}@Overridepublic void run() {while (loop) {sell();
//            synchronized (this) {//同步代码块
//                if (tickets <= 0) {
//                    System.out.println("没票了");
//                    loop = false;
//                    return;
//                }
//
//                try {
//                    Thread.sleep(10);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//
//                System.out.println("窗口" + Thread.currentThread().getName() + "卖了一张票,还剩" + (--tickets));
//            }}}
}

注意:一定要是同一个对象,如上述的windows。如果是不同的对象的话,相当于是不同的对象锁了,也就是不只一把锁,各用各的,当然就起不到线程同步了。比如:你要进厕所去方便,现在这个房间的门就相当于是对象锁,只能等里面的人出来后你在进入。若此时是不同的对象的话,就相当于有不同的门,也就是说现在这个厕所有不同的门可以进入了,那样就起不到防护机制了。

http://www.lryc.cn/news/144640.html

相关文章:

  • java内存分区
  • 【JavaScript】V8 引擎解析 JavaScript 的过程
  • Qt:界面实时响应鼠标拖动绘制
  • Docker拉取RocketMQ及可视化界面
  • 花5分钟判断,你的Jmeter技能是大佬还是小白!
  • macOS - 安装 Python 及地址
  • 前端组件库造轮子——Tree组件开发教程
  • java打war包、jar包方式,java运行war包、jar包方式
  • “超级AI助手:全新提升!中文NLP训练框架,快速上手,海量训练数据,ChatGLM-v2、中文Bloom、Dolly_v2_3b助您实现更智能的应用!”
  • 空时自适应处理用于机载雷达——机载阵列雷达信号环境(Matla代码实现)
  • lib61850 学习笔记一 (概念)
  • 【深度学习】半监督学习 Efficient Teacher: Semi-Supervised Object Detection for YOLOv5
  • vue3鼠标拖拽滑动效果
  • 08 通过从 库1 复制 *.ibd 到 库2 导致 mysql 启动报错
  • 一生一芯9——ubuntu22.04安装valgrind
  • STM32中BOOT的作用 (芯片死锁解决方法)
  • 基于YOLOv8模型和DarkFace数据集的黑夜人脸检测系统(PyTorch+Pyside6+YOLOv8模型)
  • C++中<iostream> 的cin >> str 和<string>的getline(cin, str) 用来读取用户输入的两种不同方式的不同点
  • 微信报修系统有什么优势?怎么提升企业维修工作效率与管理水平?
  • 11.2.1-通货膨胀CPI
  • 服务器基础
  • mybatis中#{ }和${ }的区别
  • 【真人语音】讯飞星火个人声音训练及导出下载工具V0.2.exe
  • 正中优配:创业板指大涨3.47%!减速器等概念板块掀涨停潮!
  • 多功能租车平台微信小程序源码 汽车租赁平台源码 摩托车租车平台源码 汽车租赁小程序源码
  • spring事件和线程池区别
  • 深圳寄墨西哥专线国际物流详解
  • PHP教学资源管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页
  • 机器学习---决策树算法(CLS、ID3、CART)
  • 【算法与数据结构】404、LeetCode左叶子之和