解决多线程当中共享资源冲突的问题

1. 冲突问题展示:

/** 共享资源冲突的问题*/
class SingleThread implements Runnable {// 共享资源,100张票private static int ticket = 100;@Overridepublic void run() {while (true) {if (ticket > 0) {System.out.println(Thread.currentThread().getName() +"售出了第" + ticket + "张票");ticket -= 1;try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {System.out.println(Thread.currentThread().getName() +"售罄!!!");break;}}}
}public class Demo1 {public static void main(String[] args) {Thread thread = new Thread(new SingleThread(),"淘票票");Thread thread2 = new Thread(new SingleThread(),"猫眼");Thread thread3 = new Thread(new SingleThread(),"美团");thread.start();thread2.start();thread3.start();}
}



从上面的例子上可以看到,最后一张票被每一个平台都卖了一次,这样子肯定是不符合实际情况的,这就是本次我们需要解决的问题。

2. 解决方法:

2.1 同步代码块
  1. 格式:
synchronized ("锁") {//需要同步的代码
}
  1. 特征:
    a: synchronized关键字后面的小括号里面的对象是锁对象,并且要求如果是多线程的情况下,锁对象必须是唯一的
    b: synchronized后大括号中的代码就是需要同步的代码,或者说加锁的代码,大括号里面的内容一次有且只允许一个线程类对象进入执行的操作,其余的线程类对象需要等待该线程类对象开锁才能进入。
    c: 同步代码块中的代码越短越好,在保证足够安全的情况下,提高性能。
// 1. 使用同步代码块解决多线程中共享资源冲突的问题/*** 自定义售票线程类* * @author **/
//同步代码块
class SingleThread1 implements Runnable {// 共享资源,100张票private static int ticket = 100;@Overridepublic void run() {while (true) {synchronized ("锁") {if (ticket > 0) {System.out.println(Thread.currentThread().getName() +"售出了第" + ticket + "张票");ticket -= 1;try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {System.out.println(Thread.currentThread().getName() +"售罄!!!");break;}}}}
}public class Demo2 {public static void main(String[] args) {Thread thread = new Thread(new SingleThread1(), "淘票票");Thread thread2 = new Thread(new SingleThread1(), "猫眼");Thread thread3 = new Thread(new SingleThread1(), "美团");thread.start();thread2.start();thread3.start();}
}
2.2 同步方法
  • 什么是同步方法:使用synchronized关键字修饰的方法就是同步方法,同步方法一次有且只允许一个线程类对象进入执行操作。
2.2.1 静态同步方法
  • 静态方法使用synchronized关键字修饰就是静态同步方法,静态同步方法的锁对象是当前类对应的字节码文件,是唯一的。
  • 如果是选择静态同步方法的话,因为锁对象是.class字节码文件,具有唯一性,多个线程使用的锁是同一个。
// 2.1 使用静态成员方法解决多线程中共享资源冲突的问题
/*** 自定义售票线程类* * @author **/
//同步方法
class SingleThread3 implements Runnable {// 共享资源,100张票private static int ticket = 100;@Overridepublic void run() {while (true) {sellTicket();if(ticket <= 0) {break;}}}// 静态同步方法public static synchronized void sellTicket() {if (ticket > 0) {System.out.println(Thread.currentThread().getName() +"售出了第" + ticket + "张票");ticket -= 1;try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {System.out.println(Thread.currentThread().getName() + "售罄!!!");}}
}public class Demo3 {public static void main(String[] args) {//使用静态同步方法Thread thread1 = new Thread(new SingleThread3(), "淘票票");Thread thread2 = new Thread(new SingleThread3(), "猫眼");Thread thread3 = new Thread(new SingleThread3(), "美团");thread1.start();thread2.start();thread3.start();}
}
2.2.2 非静态同步方法
  • 非静态方法使用synchronized关键字修饰的就是非静态同步方法,非静态同步方法的锁对象是当前类对象 - this
  • 如果是非静态同步方法的话,需要保证执行的线程类对象目标代码只有一个,因为锁对象为当前类对象。
// 2.2 使用静态成员方法解决多线程中共享资源冲突的问题
/*** 自定义售票线程类* * @author **/
//同步方法
class SingleThread3 implements Runnable {// 共享资源,100张票private static int ticket = 100;@Overridepublic void run() {while (true) {sellTicket();if(ticket <= 0) {break;}}}//非静态同步方法public synchronized void sellTicket() {if (ticket > 0) {System.out.println(Thread.currentThread().getName() +"售出了第" + ticket + "张票");ticket -= 1;try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {System.out.println(Thread.currentThread().getName() +"售罄!!!");}}}public class Demo3 {public static void main(String[] args) {//使用非静态同步方法//使用同一个目标代码对象SingleThread3 singleThread3 = new SingleThread3();Thread thread1 = new Thread(singleThread3,"淘票票");Thread thread2 = new Thread(singleThread3,"猫眼");Thread thread3 = new Thread(singleThread3,"美团");}
}
2.3 Lock锁
  1. 对象化操作:Lock lock = new ReentramtLock( );
  2. 加锁:lock.lock( );
  3. 开锁:lock.unlock( );
// 使用静态Lock锁解决共享资源冲突的问题
/*** 自定义售票线程类* * @author **/
//lock加锁操作
class SingleThread4 implements Runnable {// 共享资源,100张票private static int ticket = 100;//创建锁对象,这里使用的是静态的方式,锁对象是唯一的static Lock lock = new ReentrantLock();@Overridepublic void run() {while (true) {//加锁lock.lock();if (ticket > 0) {System.out.println(Thread.currentThread().getName() +"售出了第" + ticket + "张票");ticket -= 1;try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {System.out.println(Thread.currentThread().getName() +"售罄!!!");break;}lock.unlock();}}
}public class Demo4 {public static void main(String[] args) {Thread thread = new Thread(new SingleThread4(), "淘票票");Thread thread2 = new Thread(new SingleThread4(), "猫眼");Thread thread3 = new Thread(new SingleThread4(), "美团");thread.start();thread2.start();thread3.start();}
}

Java-如何解决多线程当中共享资源的冲突问题相关推荐

  1. java:多线程的 共享资源冲突问题

    一,java中使用Thread类实现多线程. 1,如果有两以上的线程同时访问同一个共享资源,可能造成线程冲突,线程冲突会造成数据丢失.重复等严重问题. 以下通过两个线程同时访问同一个类,来表现线程冲突 ...

  2. python多线程资源共享_Python:关于多处理/多线程和共享资源的问题

    以下是我目前发现的最简单的多线程示例:import multiprocessing import subprocess def calculate(value): return value * 10 ...

  3. 多线程对共享资源的访问

    一.什么是多线程? 线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 所有的线程虽然在微观上是串行执行的,但是在宏观上你完全可以认为它们在并行执行 二.那什 ...

  4. 多线程共享java_java多线程之共享资源

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/42587821 作者:小马 先看一个示例, 多个计数器线程实例(TwoCounter ...

  5. Java中解决继承和接口默认方法冲突

    1)超类优先.如果超类提供了一个具体方法,同名而且有相同参数类型发默认方法会被忽略. 2)接口冲突.如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方 ...

  6. 嵌套中断共享资源问题及解决

    文章目录 1 嵌套中断共享资源问题及解决 1 嵌套中断共享资源问题及解决 这个问题可以使用三种方式解决: 关总中断. 关指定中断. 请求模式解决嵌套中断共享资源问题. 这里采用关总中断的方式解决,代码 ...

  7. java面试(多线程)

    1. Callable.Future.FutureTash详解 Callable与Future是在JAVA的后续版本中引入进来的,Callable类似于Runnable接口,实现Callable接口的 ...

  8. Java多线程学习三十一:ThreadLocal 是用来解决共享资源的多线程访问的问题吗?

    ThreadLocal 是不是用来解决共享资源的多线程访问的. 这是一个常见的面试问题,如果被问到了 ThreadLocal,则有可能在你介绍完它的作用.注意点等内容之后,再问你:ThreadLoca ...

  9. Java多线程、主线程等待所有子线程执行完毕、共享资源

    1.Java创建与启动线程 Java提供两种方式创建和启动线程:1.直接Thread类,2.实现Runable接口. 1.1  继承Thread类 public class myThread exte ...

最新文章

  1. Pytorch和CNN图像分类
  2. hadoop分布式集群搭建
  3. Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook
  4. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---43
  5. 超赞的 PyTorch 资源大列表,有人把它翻译成了中文版!
  6. 用户Session相关模块重构
  7. java 上传源码_和付费网盘说再见,跟着本文自己起个网盘(Java)
  8. 我是一个*** (十三)
  9. git-osc自己定义控件之:CircleImageView
  10. Adapter模式简述
  11. java 对象转换成map_Java中对象(Object)转换成Map
  12. java注解生成xml和包含CDATA问题
  13. 识别“百度权重”作弊的方法
  14. 解决VMware安装ubuntu16.04后无法全屏的问题
  15. 什么事数据补全_事无补
  16. GGB0/OB28/OKC7/GGB1/OBBH/OKC9 FICO增强
  17. spo0lsv病毒分析
  18. Python3 pyttsx3 文字播放
  19. 在线画时序图的工具:Web Sequence Diagrams ,支持实时生成预览图
  20. 关于c++MFC开发百度地图api范例

热门文章

  1. 响应式网页设计_响应式网页设计:我们从这里去哪里?
  2. 低功耗蓝牙设备DA1458x芯片开发之更新连接参数
  3. springboot猪场管理系统 毕业设计-附源码160901
  4. 外卖CPS公众号如何实现站外引流?
  5. IOS APP 上了APPStore以后怎么修改搜索关键字
  6. Ubuntu1804里进行KITTI数据集可视化操作
  7. 你慕了么,2021年11月全国程序员薪资出炉~
  8. 通达OA 精灵登录时提示“库没有注册”(图文)
  9. android 三星闪退,三星手机升级安卓10微信闪退怎么办?(附解决方法)
  10. Anaconda pytorch cpu版本安装——图文详情版