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

相关文章

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Python从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释