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

day22知识点总结:线程安全问题及解决方法 线程礼让

Thread.yield()

线程礼让
当线程使用该方法,它就会把自己的cpu执行时间让掉,让给自己或其他线程执行。
礼让 并不一定会让 只是在某种场合下会让
MyRunnable01.java

public class MyRunnable01 implements Runnable{@Overridepublic void run() {for(int i=0;i<3;i++){//礼让 但不一定会让if(i==1){Thread.yield();}System.out.println("线程名为"+Thread.currentThread().getName()+i);}}
}

MyRunnableTest01.java

public class MyRunnableTest01 {public static void main(String[] args) {//创建对象MyRunnable01 myRunnable01=new MyRunnable01();//传递对象Thread thread1=new Thread(myRunnable01,"子线程一");Thread thread2=new Thread(myRunnable01,"子线程二");Thread thread3=new Thread(myRunnable01,"子线程三");//调用线程thread1.start();thread2.start();thread3.start();}}

在这里插入图片描述
礼让即该线程的1执行完不执行2,而是让给别的线程执行1
判断线程是否在活动

//这一个代码不一定等上面的代码全部执行完再执行System.out.println("线程一是否活动"+thread1.isAlive());

在这里插入图片描述

实例演示(网络购票)

BuyTickets01.java

public class BuyTickets01 implements Runnable{//定义总共有多少张票private int count=10;private int num=0;//卖出去的票数@Overridepublic void run() {//不知道票数到底有多少while (true){//死循环if(count<1){//循环停止条件return;}//循环一次 count-1 num+1count--;num++;//打印信息System.out.println(Thread.currentThread().getName()+"抢到了第"+num+"张票"+","+"还剩"+count+"张票");}}
}

Test01

public class Test01 {public static void main(String[] args) {//1.创建对象BuyTickets05 buyTickets05=new BuyTickets05();//2.创建线程对象 然后把buyTickets05传递给线程Thread t1=new Thread(buyTickets05,"个人");Thread t2=new Thread(buyTickets05,"黄牛");Thread t3=new Thread(buyTickets05,"网络");//3.启动线程t2.start();t1.start();t3.start();}
}

在这里插入图片描述
出现线程安全问题,同一线程抢了同一张票
解决原理:被锁代码在同一时刻只允许一个线程访问。
解决方式一:在共享代码处加一个锁
// synchronized (BuyTickets01.class)写成这种形式也可
在这里插入图片描述
运行截图
在这里插入图片描述
解决方式二:在方法体中加锁(将循环体抽取出一个方法)
在这里插入图片描述
运行截图
在这里插入图片描述
注:静态方法中不能使用 this 且里面的变量要是 静态变量
解决方式三:在方法名前加锁
在这里插入图片描述
运行截图
在这里插入图片描述
解决方式四:在方法名前加锁
在这里插入图片描述
运行截图
在这里插入图片描述
面试题
问:ArrayList类中add()方法是否是线程安全的?
答:是线程不安全的 因为没有加synchroniaed
作业:
1.模拟多人同步爬山
2.模拟叫号看病


http://www.taodudu.cc/news/show-8457254.html

相关文章:

  • 线程休眠、中断、强制执行与礼让分析
  • 用java编写判断三角形_如何用java代码来做三角形的判断?
  • 线程的优先级、守护线程、礼让线程、插入线程、中断线程
  • Java多线程学习笔记(4)— “Thread类三个方法:线程休眠sleep()、线程礼让yield()、线程强制执行join()”
  • java多线程(三) —— Thread方法(休眠,礼让,强制执行,守护线程)
  • 多线程_10_礼让yield
  • yield() 初让线程(礼让线程)
  • 不礼让行人怎么抓拍的_权威发布:丹阳正式抓拍斑马线前不“礼让行人”,八张图告诉您如何正确礼让...
  • 苹果手机更改定位 - 爱思助手
  • 爱思助手“显示发送描述文件到设备失败”
  • 写一个python代码自动读取eⅹcle内容,把内容提交到网页
  • ACM MM 2023| CLE Diffusion:可控光照增强扩散模型(low light image enhancement)
  • App 的界面设计流程
  • Allegro16.6添加标注的方法
  • 老SDRAM和DDR SDRAM时序图与信号完整性仿真结合运用(2) -版本博客图片丢失,增加图片后又不能上传,shit.
  • 实战:内容营销如何吸引顾客 试试五个切入点
  • 关于外场测试的一点儿介绍
  • 笔记本用gpu运行tensorflow-gpu,keras写的老程序,结果与原来不一样,一脸懵逼。
  • 腾讯一面!说说ArrayList的遍历foreach与iterator时remove的区别,我一脸懵逼
  • 信心满满去面美团,结果被JVM9连问怼的一脸懵逼
  • 字节跳动面到这道题,有的读者一脸懵逼,有的读者笑嘻嘻
  • 初学网络安全一脸懵逼?看懂直接跪下!
  • 微信小程序app.json全局配置
  • 计算机毕业设计PHP+安卓美食菜谱App(源码+程序+lw+远程调试)
  • 同城厨师上门做饭系统源码做菜预约做饭家宴代厨轰趴app源码厨师入住+厨师傅端/前端语言uniapp
  • 历书中的哥伦布
  • GPS历书(Almanac)和星历(Ephemeris)有什么区别?
  • SSM之一点一滴:Object对象使用Field反射遍历书输出
  • how many days c语言,万年历书-C精粹的万年历C语言实例解析精粹这本书的万年历程序实在是看不懂, 爱问知识人...
  • GPS星历与历书的区别