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

2024-02-13 03:50

本文主要是介绍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.模拟叫号看病

这篇关于day22知识点总结:线程安全问题及解决方法 线程礼让的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704417

相关文章

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤