多线程学习

1.同步代码块,同步方法

同步代码块

  • 代码块又称为初始化块,属于类中的成员[即是类的一部分],类似于方法,将逻辑语句分装在方法体中,通过{}包围起来。

  • 和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不通过对象或类显示调用,而是加载类时,或创建对象时隐形调用

public class MyThread extends Thread{static int ticket=0;static Lock lock=new ReentrantLock();@Overridepublic void run(){while(true){lock.lock();try {if(ticket==50){break;}else {Thread.sleep(100);ticket++;System.out.println(Thread.currentThread().getName()+"   "+ticket);}} catch (InterruptedException e) {throw new RuntimeException(e);}finally {lock.unlock();}}}
}

为什么要用同步代码块(好处)
优点:

1.相当于另一种形式的构造器(对构造器的补充机制),可以做初始化的操作。
应用场景:假设在类中多个构造器中有重复语句,可以抽取到初始化代码块中,提高代码的重用性。
2.和设计模式中的"单例设计模型"有关(与static修饰符关联有奇效)。
注意:代码块与构造器的调用规则:代码块的执行是优先于构造器的。

同步方法

public class MyRunnable implements Runnable{int ticket=0;public String name;@Overridepublic void run(){/*1.循环2.同步代码块(或者同步方法)3.判断共享数据是否到了末尾,如果到了末尾4.判断共享数据是否到了末尾,如果没到末尾*/while(true){synchronized (this){if (method()) break;}}}private boolean method() {if(ticket==50){return true;}else{try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}ticket++;System.out.println(Thread.currentThread().getName()+"   "+ticket);}return false;}}

2.等待唤醒机制

等待唤醒机制中的方法
等待唤醒机制就是用于解决线程通信的问题的,使用到的3个方法的含义如下:

① wait方法:线程不再活动,不再参与调度,进入wait set中(一个等待的集合中),因此不会浪费CPU资源,也不会去竞争锁,这时的线程状态为WAITING(等待状态)。处于WAITING状态的线程需要等待别的线程的通知(notify),然后才能从wait set中释放出来,重新进入调度队列(ready queue)
② notify方法:通知在wait set中的一个线程释放,等待时间越久的约先释放
③ notifyAll方法:释放所有在wait set中的全部线程

注意:
哪怕只通知了一个处于等待中的线程,被通知的线程也不能立即回复执行,因为它是在判断了是否含有锁对象发现没有后才中断的,所以他需要再次尝试获取锁(这个过程很可能会面临其他线程的竞争),成功后才能在最开始调用wait方法之后的地方恢复执行

package com.lc.test02;import java.util.concurrent.TimeUnit;/*** @author liuchao* @date 2023/4/8*/
public class ThreadWaitOne {/*** 注意:必须使用同一把锁*/static Object lock = new Object();public static void main(String[] args) {/*** 线程1*/Thread t1 = new Thread(() -> {synchronized (lock) {System.out.println("进入" + Thread.currentThread().getName());try {lock.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();}System.out.println(Thread.currentThread().getName() + "被唤醒");}}, "t1");t1.start();try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {Thread.currentThread().interrupt();}/*** 线程2*/Thread t2 = new Thread(() -> {synchronized (lock) {System.out.println("进入" + Thread.currentThread().getName());lock.notify();System.out.println("唤醒通知已发");}}, "t2");t2.start();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP反序列化命令执行+PHP反序列化POP大链 +PHP反序列化基础

[题目信息]: 题目名称题目难度PHP反序列化命令执行1 [题目考点]: 反序列化命令执行,获取题目flag。[Flag格式]: SangFor{t5euvZ_OB8Jd_h2-}[环境部署]: docker-compose.yml文件或者docker tar原始文件。 docker-compose up …

DataGrip2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 DataGrip是由JetBrains公司开发的一款强大的关系数据库集成开发环境(IDE),专为数据库开发人员和数据库管理员设计。它提供了一个统一的界面,用于管理和开发各种关系型数据库&#x…

用于半监督的图扩散网络 笔记

1 Title Graph Neural Diffusion Networks for Semi-supervised Learning(Wei Ye, Zexi Huang, Yunqi Hong, and Ambuj Singh)【2022】 2 Conclusion This paper proposes a new graph neural network called GND-Nets (for Graph Neural Diffu…

计算股价波动率python

上述图片上传gemini,提问:转换为python代码 好的,以下是您发送的图像中公式的 Python 代码: python def stock_volatility(prices, opening_prices, N): """ 计算股票价格的波动率。 参数: p…

vscode如何方便地添加todo和管理todo

如果想在vscode中更加方便的添加和管理TODO标签,比如添加高亮提醒和查看哪里有TODO标签等,就可以通过安装插件快速实现。 安装插件 VSCode关于TODO使用人数最多的插件是TODO Height和Todo Tree 按住 CtrlShiftX按键进入应用扩展商店,输入to…

getOutputStream() has already been called for this response

问题描述 在做java导出Excel数据的时候,接口层面需要有HttpServletResponse的入参来设置输出流 然后执行的时候报getOutputStream() has already been called for this response错误 问题排查 返回的错误信息 {"timestamp": "2024-04-16T11:49:…

潮玩宇宙小程序定制大逃杀游戏APP开发H5游戏

游戏名称:潮玩宇宙大逃杀 游戏类型:休闲竞技类小游戏 游戏目标:玩家通过选择房间躲避杀手,生存下来并瓜分被杀房间的元宝。 核心功能 房间选择:玩家进入游戏后,可以选择一间房间躲避杀手。杀手行动&…

机器学习——自动驾驶

本章我们主要学习以下内容: 阅读自动驾驶论文采集数据根据论文搭建自动驾驶神经网络训练模型在仿真环境中进行自动驾驶 论文介绍 本文参考自2016年英伟达发表的论文《End to End Learning for Self-Driving Cars》 📎end2end.pdf

c语言中的数组

数组 数组是一种构造类型,是由基本类型构造而成。当我们想用一群变量来描述同一类相同的东西时候,比如100个年龄变量,我们可以这样int age1;int age2;int age3;……int age 100;这样即不方便书写&#xff…

通过腾讯云搭建跨境电商demo的详细操作过程(建站系统 保姆级指导,巨详细)

引言: 有许多做跨境电商的朋友,或者为跨境电商服务的小企业,都会面临搭建电商平台V1.0的问题 因此,花了点时间,找了一个开源的项目,让大家可以跑起来,一方面了解平台都有哪些模块,另…

揭秘ebay、亚马逊测评系统:从稳定环境搭建到防关联技术

在亚马逊、ebay平台上进行自养号测评、L ka等活动,首要问题是确保环境的安全性和稳定性。一个稳定的环境是进行测评的基础,如果无法解决安全性问题,那么从事这些项目就不值得。我们在环境技术研发领域已经有8年的经验,在早期测试了…

创建k8s deploy yaml文件的imagePullSecrets语句

镜像仓库是harbor kubectl create secret docker-registry key --docker-server192.168.0.190 --docker-usernameadmin --docker-passwordHarbor12345

Lagent AgentLego 智能体介绍

本文主要介绍智能体相关基础知识,主流的智能体开源项目,重点介绍Lagent智能体和AgentLego框架。 一. 为什么要有智能体 目前的大预言模型有一些局限性,包括有时候会生成虚假信息,也就是我们说的“大模型胡言乱语”,还…

LeetCode 每日一题 Day 123-136

1379. 找出克隆二叉树中的相同节点 给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 original 中的目标节点 target。 其中,克隆树 cloned 是原始树 original 的一个 副本 。 请找出在树 cloned 中,与 tar…

【C++风云录】音频处理与音乐生成的C++库:解锁无限创意

探索C库的音频魔力:音频处理与音乐生成的创新之路 前言 音频处理和音乐生成是计算机音频领域的重要研究方向,它们在音乐产业、娱乐应用和创意艺术等领域具有广泛的应用。C作为一种高效、灵活的编程语言,为开发音频处理和音乐生成的应用程序…

运维前端vue部署

文章目录 一、本地环境准备二、代码结构及功能三、部署上线步骤简介补充代码操作命令 补充代码操作命令 四、接收后端数据统一接口五、其他 一、本地环境准备 1.node.js 安装(建议版本:v14.16.0) 参考:https://www.cnblogs.com/l…

ChatGPT辅助下的论文写作之道

ChatGPT无限次数:点击直达 ChatGPT辅助下的论文写作之道 在当今信息爆炸的时代,学术论文写作是每个研究者和学生不可或缺的技能。然而,对于许多人来说,写作是一个具有挑战性和耗时的过程。幸运的是,随着人工智能技术的不断进步&a…

虚拟机下如何使用Docker(完整版)

Docker详细介绍: Docker 是一款开源的应用容器引擎,由Docker公司最初开发并在2013年发布。Docker的核心理念源自于操作系统级别的虚拟化技术,尤其是Linux上的容器技术(如LXC),它为开发人员和系统管理员提供…

字体反爬积累知识

目录 一、什么是字体反扒 二、Unicode编码 三、利用font包获取映射关系 一、什么是字体反扒 字体反爬是一种常见的反爬虫技术,它通过将网页中的文本内容转换为特殊的字体格式来防止爬虫程序直接获取和解析文本信息。字体反爬的原理是将常规的字符映射到特殊的字…

Linux C++ 040-STL之算术生成算法

Linux C 040-STL之算术生成算法 本节关键字:Linux、C、算术生成算法 相关库函数:accumulate、fill accumulate() 功能描述:计算区间内,容器元素累计总和 函数原型: accumulate(iterator beg, iterator end, value)…