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

Day41线程同步

线程同步

  1. 案例:三个窗口卖100张票

    //定义一个类SellTicket实现Runnable接口,定义成员变量100张票
    public class SellTicket implements Runnable{private int tickets = 100;//重写run方法@Overridepublic void run(){while (true){       //没有票后,死循环一直让动作执行if(tickets>0){  //判断票数大于1卖票System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");//告知卖票窗口tickets--; //卖票后总数减一}}}
    }
    //创建测试类
    public class SellTicketDemo{public static void main(String[] args){//创建SellTicket类对象SellTicket st = new SellTicket();//创建三个Thread类对象,把SellTicket对象作为构造方法的参数,给出对应窗口名称Thread t1 = new Thread(st,"窗口1");Thread t2 = new Thread(st,"窗口2");Thread t3 = new Thread(st,"窗口3");//启动线程t1.start();t2.start();t3.start();}
    }
    1. 多线程程序出现安全问题(条件:多线程环境;有共享数据;有多条语句操作共享数据)

避免安全问题,需要锁多条语句操作共享数据,可以使用同步代码块实现(线程过多时耗费资源)

格式:synchronized(任意对象){多条语句操作共享数据的代码}(相当于给代码加锁,任意对象可以看成是一把锁)

public class SellTicket implements Runnable{private int tickets = 100;private Object obj = new Object();//创建一个Object对象,当作同一把锁@Overridepublic void run(){while (true){synchronized(obj){  //当t1进来后,就会锁住代码,其他线程进不来if(tickets>0){  try{Thread.sleep(100);}//休息100毫秒catch(InterruptedException e){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");tickets--; }}}}
}
  1. 同步方法: 同步方法:就是把synchronized关键字加到方法上 格式:修饰符 synchronized返回值类型 方法名(方法参数){}

    同步方法锁对象是 :this synchronized(this)

    同步静态方法:把synchronized关键字加到静态方法上 格式:修饰符 static synchronized 返回值类型 方法名(方法参数){}

    同步静态方法锁对象是:类名.class synchronized(SellTicket.class)

  2. Lock锁实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作

    Lock中提供了获得锁和释放锁的方法:void lock():获得锁 void unlock():释放锁

    Lock是接口不能直接实例化,采用实现类ReentranctLock来实例化 ReentrantLock的构造方法:ReentrantLock():创建一个ReentrantLock实例

public class SellTicket implements Runnable{private int tickets = 100;private Lock lock = new ReentrantLock();//创建一个ReentrantLock实例化对象@Overridepublic void run(){while (true){try{lock.lock();if(tickets>0){  try{Thread.sleep(100);}//休息100毫秒catch(InterruptedException e){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");tickets--; }finally{lock.unlock();}//释放锁不管上面代码是否出现错误都执行}}}
}
http://www.lryc.cn/news/65299.html

相关文章:

  • 设计模式之享元模式
  • 【GAMES101】05 Rasterization(Triangles)
  • 13. Pod 从入门到深入理解(二)
  • ORBBEC(奥比中光)AstraPro相机在ROS2下的标定与D2C(标定与配准)
  • 常量与变量:编程中重要的两种数据类型
  • ( 数组和矩阵) 287. 寻找重复数 ——【Leetcode每日一题】
  • 【学习笔记】「JOISC 2022 Day2」复制粘贴 3
  • 武忠祥老师每日一题||定积分基础训练(三)
  • Docker安装常用软件-Apollo(有问题)
  • f(x)与|f(x)|,f ‘ (x),F(x)常见关系。
  • 今天面了一个来字节要求月薪23K,明显感觉他背了很多面试题...
  • 如何使用二元三次回归分析建立预测模型?(分析、原理、代码示例)
  • 面向万物智联的应用框架的思考和探索(上)
  • 《Python机器学习基础教程》第1章学习笔记
  • ClickHouse 内存管理是如何实现的
  • docker容器技术
  • 设计模式七大设计原则
  • 【Hello Network】TCP协议相关理解
  • 实施CRM目标有哪几步?如何制定CRM目标?
  • 船舶建造概论(船舶建造工艺任务与现代造船模式)
  • 项目内训(2023.5.6)
  • 【操作系统OS】学习笔记第二章 进程与线程(下)【哈工大李治军老师】
  • Linux命令集(Linux文件管理命令--rmdir指令篇)
  • 在技术圈超卷的当下,学历到底是敲门砖还是枷锁?
  • Linux cgroup
  • PID整定二:基于Ziegler-Nichols的频域响应
  • 【tkinter 专栏】专栏前言
  • 解决Linux中文字体模糊的4种方法
  • 【Android入门到项目实战-- 7.3】—— 如何调用手机摄像头和相册
  • 浅聊AIOT