韩顺平0基础学java——第29天

news2024/11/27 2:19:45

p592-599

线程

用户线程和守护线程

1.用户线程:也叫工作线程,当线程的任务执行完或通知方式结束
2守护线程:一般是为工作线程服务的,当所有的用户线选束,守护线程自动结束

3.常见的守护线程:垃圾回收机制

当我们希望当main线程结束后,子线程自动结束,那我们只用将子线程设置为守护线程即可。

线程的生命周期

线程同步机制

1.在多线程编程,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完整性。
2.也可以这里理解:线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作。

Synchronized关键字
同步具体方法-Synchronized
1.同步代码块
synchronized(对象){//得到对象的,才能操作同步代码
需要被同步代码;
2. synchronized还可以放在方法上,表示整个方法为同步方法
public synchronized void m (String name){
//需要被同步的代码
}
3.如何理解:
就好像某小伙伴上厕所前先把门关上(上锁).完事后再出来(解锁).那么其它小伙伴就可在使用厕所了
4.使用synchronized解决售票问题

package com.day29;

import org.omg.PortableServer.THREAD_POLICY_ID;

public class Day29 {
    public static void main(String[] args) {
        T t = new T();
        new Thread(t).start();
        new Thread(t).start();
        new Thread(t).start();


    }
}
class T implements Runnable{
    private static int tick = 100;
    private boolean loop = true;//控制run的死循环
    public synchronized void sell(){//用synchronized上锁
        if(tick<=0){
            System.out.println("票卖完了。");
            loop=false;
            return;
        }
        System.out.println(Thread.currentThread().getName()+
                "窗口售出一张,还有"
                +--tick+"张。");
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        while(loop){
          sell();

        }
    }
}

同步的原理

synchronized是一把锁,当多个线程进入时就会争夺这把锁,执行完后放回锁。

互斥锁

1.Java在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。
2.每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
3.关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
4.同步的局限性:导致程序的执行效率要降低
5.同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象)

6.同步方法(静态的)的锁为当前类本身。

1.同步方法如果没有使用static修饰:默认锁对象为this

2.如果方法使用static修饰,默认锁对象:当前类.class

3.实现的落地步骤;
需要先分析上锁的代码选择同步代码块或同步方法
要求多个线程的锁对象为同一个即可!

线程死锁

多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程是一定要避免死锁的发生.

释放锁


下面操作会释放锁
1.当前线程的同步方法、同步代码块执行结束案例:上厕所,完事出来
2.当前线程在同步代码块、同步方法中遇到break、return.案例:没有正常的完事,经理叫他修改bug,不得已出来
3.当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束案例:没有正常的完事,发现忘带纸,不得已出来
4.当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释
放锁。
案例:没有正常完事,觉得需要酝酿下,所以出来等会再进去
 

下面操作不会释放锁
1.线程执行同步代码块或同步方法时,程序调用Thread.sleep)、Thread.yield(方
法暂停当前线程的执行,不会释放锁
案例:上厕所,太困了,在坑位上眯了一会
2.线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,
该线程不会释放锁。
提示:应尽量避免使用suspend()和resume()来控制线程,方法不再推荐使用
 

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

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

相关文章

C# Onnx Yolov5 水果识别,人员识别,物品识别 人工智能

目录 先上效果 来电废话&#xff0c;但实用 网络成功案例实践易失败的原因 万物检测涉及技术 下载合集 关键代码 全部代码 实操vs2022安装关键 YOLO V5核心库编译 编写自己识别软件 更新相关依赖 标注字库文件 测试效果 名词解释YOLO 名词解释ONNX 源码 直播教…

利用第三方服务对目标进行被动信息收集防止被发现(web安全白帽子)

利用第三方服务对目标进行被动信息收集防止被发现&#xff08;web安全白帽子&#xff09; 1 被动信息收集1.1 信息收集内容1.2 信息用途 2 信息收集-DNS2.1 DNS信息收集NSLOOKUP2.1.1 ping2.1.2 nslookup 2.2 DNS信息收集-DIG&#xff08;此命令查到的结果更复杂些&#xff0c;…

Apache IoTDB vs InfluxDB 开源版,架构性能全面对比!

分布式、端边云同步、读写查询性能&#xff0c;Apache IoTDB 与 InfluxDB 开源版的详尽对照&#xff01; 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长&…

Golang | Leetcode Golang题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; func calculateMinimumHP(dungeon [][]int) int {n, m : len(dungeon), len(dungeon[0])dp : make([][]int, n 1)for i : 0; i < len(dp); i {dp[i] make([]int, m 1)for j : 0; j < len(dp[i]); j {dp[i][j] math.MaxInt32}}dp[…

爬虫笔记11——网页爬取数据写入csv

数据持久化存储进文件&#xff0c;前面的文章已经讲解如何存储入Excel表格了&#xff0c;有兴趣可以看一下&#xff0c;现在来记录一下如何存储进csv文件。 csv存储 csv简述 csv就是一个普通文件&#xff0c;里面的内容是每一行中的数据用逗号分隔&#xff0c;然后文件后缀为…

Golang | Leetcode Golang题解之第179题最大数

题目&#xff1a; 题解&#xff1a; func largestNumber(nums []int) string {sort.Slice(nums, func(i, j int) bool {x, y : nums[i], nums[j]sx, sy : 10, 10for sx < x {sx * 10}for sy < y {sy * 10}return sy*xy > sx*yx})if nums[0] 0 {return "0"…

教师信息管理系统

摘要 随着互联网技术与信息时代的高速发展和应用&#xff0c;教育行业也逐渐意识到互联网技术与信息化管理的融合。在传统的教师信息管理中&#xff0c;往往需要大量的纸质档案和手工处理&#xff0c;不仅效率低下&#xff0c;而且容易出现信息丢失和错误。因此为了提高教师信…

解决vs2022无法安装扩展程序包

在工具—>NuGet包管理器—>程序包管理设置&#xff0c;把程序包源设置为https://www.nuget.org/api/v2/&#xff0c;如下图 然后就可以在管理解决方案包界面搜索下载自己需要的扩展包

安全之战,巅峰对决 | 第八届XCTF国际网络攻防联赛总决赛首日赛况公布!

XCTF联赛由清华大学蓝莲花(Blue-Lotus)战队发起&#xff0c;国家创新与发展战略研究会主办&#xff0c;赛宁网安总体承办&#xff0c;旨在探索网络安全创新能力与发展潜力。第八届XCTF国际网络攻防联赛总决赛在四川省经济和信息化厅、四川省教育厅、四川省公安厅的指导下&#…

kafka(二)安装部署(2)windows

一、前提 安装Kafka之前&#xff0c;需要安装JDK、Zookeeper、Scala, 本次安装版本选择&#xff1a; JDK&#xff1a;1.8 Zookeeper&#xff1a;3.6.4 Scala&#xff1a;2.12 Kafka&#xff1a;3.5.2 1、jdk Java Downloads | Oracle 见jdk下载安装。 2、Zookeeper 下载…

Android进程间通信 Messenger详解

//这里服务端Service是运行在单独的进程中的 android:process“:other” class MessengerService : Service() { private lateinit var mMessenger: Messenger override fun onBind(intent: Intent): IBinder { log(TAG, “onBind~”) //传入Handler实例化Messenger mMes…

Android测量

最大模式&#xff08;MeasureSpec.AT_MOST&#xff09; 这个也就是父组件&#xff0c;能够给出的最大的空间&#xff0c;当前组件的长或宽最大只能为这么大&#xff0c;当然也可以比这个小。 最高两位是11的时候表示”最大模式”。即MeasureSpec.AT_MOST未指定模式&#xff08;…

Java | Leetcode Java题解之第179题最大数

题目&#xff1a; 题解&#xff1a; class Solution {public String largestNumber(int[] nums) {int n nums.length;// 转换成包装类型&#xff0c;以便传入 Comparator 对象&#xff08;此处为 lambda 表达式&#xff09;Integer[] numsArr new Integer[n];for (int i 0;…

windows git配置多个账号

window下git多账号配置_百度搜索 (baidu.com) 最重要的是这里生成新的id_rsa文件的时候&#xff0c;bash窗口是在 .ssh路径下 其实就是这个窗口在什么路径下执行的就是生成在什么路径 下面窗口路径不对&#xff0c;不是Desktop&#xff0c;应该是.ssh 如果是Desktop或者任何一…

如何解决跨区域文件传输存在的安全管控问题?

⼤型企业和集团为扩⼤市场份额、优化资源配置&#xff0c;会在不同地区设⽴多级下属分⽀机构、研发中心、实验室等&#xff0c;存在研发数据横向或纵向流转的需求&#xff0c;研发数据进行跨区域文件传输的场景。跨区域可能是网络区域&#xff0c;也可能是地理区域&#xff0c;…

常见数字化转型方案撰写的思维模式

通过这一段时间的学习和倾听,结合DAMA数据管理知识体系学习与项目实践,对大部分数据治理类项目、信息化建设和数字化转型项目的思维模式做了一些总结梳理,具体有如下四种,供参考。 一、方法1:结合环境六边形法 1.要点题,弄清楚问题是什么 2.目标原则有哪些,补充哪些 3.…

Android O 适配详细指南

NotificationChannel channel new NotificationChannel(mChannelId, name, NotificationManager.IMPORTANCE_DEFAULT); mNotificationManager.createNotificationChannel(channel); } } // 创建通知传入channelId NotificationCompat.Builder builder new NotificationCompat…

【Linux详解】缓冲区优化 | 进度条的实现 | Linux下git 的上传

目录 一. 缓冲区 1. 缓冲区概念 2. 缓冲区作用 2.1 提升读写效率 2.2 减少等待时间 3. 缓冲区刷新策略 3.4 特殊策略 4. 缓冲区存储位置 5. 总结 二. 实现进度条 引入&#xff1a;倒计时 process.c 三. Linux下git的上传 sum 一. 缓冲区 1. 缓冲区概念 缓冲区是…

C++实现自动生成c++类中的属性的get和set方法

目录 应用场景 运行准备 代码展示 结果显示 应用场景 当我们在编写类的属性时&#xff0c;需要对该属性进行封装&#xff0c;需要一系列的get和set的方法。例如下面是天气类的成员属性。可以看到属性很多&#xff0c;而写get和set都是一些固定的操作&#xff0c;因此可以直…

Swift 中的动态数组

Swift 的 Array 类型是一种强大而灵活的集合类型&#xff0c;可以根据需要自动扩展或缩减其容量。 动态数组的基本概念 Swift 中的数组是基于动态数组&#xff08;dynamic array&#xff09;的概念实现的。动态数组能够根据需要自动调整其容量&#xff0c;以容纳新增的元素&a…