Java面试题:多线程2

如何停止正在运行的线程

1,使用退出标志,使线程正常退出(run方法中循环对退出标志进行判断)
2,使用stop()方法强行终止(不推荐)
3,调用interrupt()方法中断线程

打断阻塞线程(sleep,wait,join),线程会抛出InterruptedException异常

打断正常的线程,可以根据打断状态来标记是否退出线程

打断标记:线程.isInterrupted返回一个布尔值代表是否被打断

sychronized底层原理

Synchronized简介

同步锁,保证在同一时刻,被修饰的代码块或者方法只会被一个线程执行,从而保证线程安全.

Synchronized特性

锁对象:

java对象结构

请添加图片描述

可以分为三块布局:

示例数据(Instance Data)

存储了对象的实际数据

对象属性,父类属性,(数组长度)

对齐填充(Padding)

按8字节整数倍对齐填充

对象头(Header)

Mark Word + Class Metadata Address

请添加图片描述

M:

哈希码

分代年龄

(触发GC对象回收的次数,到达15就会从新生代转移到老年代)

GC标志

(GC记录对象是否存活)

锁信息
轻量级锁中的指针就是锁记录record
重量级锁中的指针就是指向关联的monitor

C:

类型指针(判断对象是哪个类的实例)

(数组长度)

锁类型

jdk1.6之前:

无锁
重量级锁:

底层通过java中的监视器锁(monitor)实现,每个java对象都有一个对应的监视器锁,只有获取了对象的监视器锁,线程才能执行同步代码块或者同步方法.

所有竞争锁失败的线程全部都会被阻塞挂起直到锁释放后被唤醒.

效率很低

monitor对象

jvm提供,c++实现

每个Java对象都可以关联一个monitor对象,一旦使用synchronized上锁后,这个对象的对象头的markword中就会设置指向这个monitor对象的指针

(notify,notifyall,wait)

获取对象锁就是获取monitor的所有权

请添加图片描述

当一个线程获取锁时,count++

owner设为这个线程

锁处于锁定状态

当通过wait()或执行完代码进行释放

就会复位相关状态->count–,owner设为空

获取锁的对象可以反复获取monitor对象,每获取一次count就++,

对应锁计数也需要多减一次,减到0锁才会释放

1.6之后:

偏向锁:

当第一个线程执行同步代码块时

不存在多线程竞争

锁就会偏向于这个线程,使用CAS将线程ID设置到自己的MD头,再次请求锁时,只需要判断markword中的锁标记是不是偏向锁,线程id是不是保持一致就可以直接请求到锁.

只会CAS一次

轻量级锁:

当第二个线程去申请锁时,锁就会升级为轻量级锁,在这种情况下,线程会进入CAS自旋而非挂起,不断的循环比较和替换(markword替换指向锁记录的指针),一直耗费cpu申请直到重新拿到锁,避免线程的阻塞和唤醒.

每次指向到 synchronized 代码块时,都会创建锁记录(Lock Record)对象,每个线程都会包括一个锁记录的结构,锁记录内部可以储存对象的 Mark Word 和对象引用 reference

用Object reference指向锁对象

用lock record(指向线程的地址)替换锁对象的对象头数据

解锁时交换回来(CAS)

请添加图片描述
请添加图片描述

jdk1.7后引入自适应自旋锁,根据锁自旋的结果来调整锁的自旋次数和是否阻塞.

自旋一定次数后,就会变为重量级锁

当锁发生重入,就会再添加一个锁记录来记录重入次数

对比

偏向锁:

只适用于一个线程情况

加锁解锁无需额外消耗,速度几乎相当于没加锁

轻量级锁:

只适用于少量线程竞争锁对象的情况且临界区较小,锁占用时间短

提高程序的响应速度,线程不会阻塞

但自旋会持续消耗cpu

重量级锁:

底层使用Monitor实现

适用于吞吐量大,锁占用时间长

不使用自旋消耗cpu

但线程挂起,响应时间缓慢

线程上下文切换->用户态和内核态的切换,成本较高

用户态:访问资源受限,权限较低
内核态:访问资源多,权限高

锁消除

在编译时进行扫描,去除不可能存在竞争的锁

@Override
public synchronized StringBuffer append(String str) {
	toStringCache = null;
	super.append(str);
	return this;
}
//同步方法
public static String Test(String str){
    StringBuffer sb = new StringBuffer();
    sb.append(str);
    sb.append(str);
    return sb.toString
}
//因为sb对象仅在这个方法内生效,所以此时下面两个append是不存在线程安全问题的,方法上的锁将被自动消除.

锁粗化

通过扩大锁的范围,避免反复加锁和释放锁

public void Test() {
   for (int i = 0; i < 100; i++) {
        synchronized(lock){
            ........
   		}
    }
}
public void Test() {
   	synchronized(lock){
   		for (int i = 0; i < 100; i++) {
            ........
   		}
    }
}

HotSpot虚拟机

java虚拟机,将常用代码编译为原生代码执行,提高性能

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

继承知识及扩展(C++)

1. 继承是什么&#xff1f; 继承是面向对象编程的三大特征之一&#xff0c;也是代码复用的手段之一。之前我们在很多的地方尝试函数的复用&#xff0c;而继承是为了类的复用提供了很好的方式。 &#xff08;1&#xff09;继承的代码怎么写 在一个类后面使用 &#xff1a;继承方…

知识图谱融入RAG模型:LinkedIn重塑智能客服新范式【附LeCun哈佛演讲PPT】

原文&#xff1a;Retrieval-Augmented Generation with Knowledge Graphs for Customer Service Question Answering 一、研究背景与问题 在客服领域,快速准确地匹配用户问题与历史工单,是提供优质回答的关键。传统的检索增强生成(Retrieval-Augmented Generation, RAG)方法虽…

IDEA-控制台日志过滤插件 - Grep Console

IDEA-控制台日志过滤插件 - Grep Console 当idea控制台日志较多时&#xff0c;为了方便查找关键字&#xff0c;使用Grep Console插件&#xff0c;指定控制台中关键字高亮显示 1.安装 2.使用 2.1 高亮显示 控制台中指定颜色高亮显示指定字符 效果: 重启项目后还是会高亮显示 取…

【软考高项】三十三、质量管理

一、管理基础 质量定义 国际标准&#xff1a;反映实体满足主体明确和隐含需求的能力的特性总和。 国家标准&#xff1a;一组固有特性满足要求的程度。固有特性是指在某事或某物中本来就有的&#xff0c;尤其是那种永久的可区分的特征。 ➢ 对产品来说&#xff0c;例如…

缓存菜品操作

一&#xff1a;问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 二&#xff1a;实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; 每个分…

k8s保持pod健康

存活探针 Kubemetes 可以通过存活探针 (liveness probe) 检查容器是否还在运行。可以为 pod 中的每个容器单独指定存活探针。如果探测失败&#xff0c;Kubemetes 将定期执行探针并重新启动容器。 Kubemetes 有以下三种探测容器的机制&#xff1a; HTTP GET 探针对容器的 IP 地…

Day61:单调栈 739. 每日温度 496.下一个更大元素 I

739. 每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: 输…

发表博客之:gemm/threadblock/threadblock_swizzle.h 文件夹讲解,cutlass深入讲解

文章目录 [发表博客之&#xff1a;gemm/threadblock/threadblock_swizzle.h 文件夹讲解&#xff0c;cutlass深入讲解](https://cyj666.blog.csdn.net/article/details/138514145)先来看一下最简单的struct GemmIdentityThreadblockSwizzle结构体 发表博客之&#xff1a;gemm/th…

vue2 webpack-dev-server Unknown promise rejection reason

在vue.config.js中添加如下配置&#xff0c;重启项目即可 module.exports defineConfig({devServer: {client: {overlay: false,},} })参考

探索中位数快速排序算法:高效寻找数据集的中间值

在计算机科学领域&#xff0c;寻找数据集的中位数是一个常见而重要的问题。而快速排序算法作为一种高效的排序算法&#xff0c;可以被巧妙地利用来解决中位数查找的问题。本文将深入探讨中位数快速排序算法的原理、实现方法以及应用场景&#xff0c;带你领略这一寻找中间值的高…

vue 金额组件,输入提示单位:‘千’、‘万’、‘十万’...并用‘,’三个格式化

近期项目中遇到一个需求&#xff0c;金额输入框&#xff0c;输入过程中自动提示‘千’、‘万’、‘十万’、‘百万’......等单位提示&#xff0c;鼠标失去焦点后&#xff0c;并用‘,’三位隔开计数。 例如&#xff1a; 输入&#xff1a;12345.99 失去焦点&#xff1a;12,34…

Vue--》从零开始打造交互体验一流的电商平台(一)

今天开始使用 vue3 ts 搭建一个电商项目平台&#xff0c;因为文章会将项目的每处代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的github上&#xff0c;大家可以自行去进行下载运行&#xff0c;希…

【Node.js工程师养成计划】之express中间件与接口规范

一、Express中间件的概念与基本应用 const express require(express)// 加一个注释&#xff0c;用以说明&#xff0c;本项目代码可以任意定制更改 const app express()const PORT process.env.PORT || 3000// // 挂载路由 // app.use(/api, router)// // 挂载统一处理服务端…

【倪亲斫经典水墨云纹仲尼式】倪诗韵亲斫古琴

【倪亲斫经典水墨云纹仲尼式】倪诗韵亲斫古琴 松透润&#xff0c;适合大曲文曲潇湘欸乃平沙&#xff0c;余韵悠长&#xff0c;手感极其舒适&#xff0c;久弹不疲。

[Linux][网络][TCP][三][超时重传][快速重传][SACK][D-SACK][滑动窗口]详细讲解

目录 1.超时重传1.什么是超时重传&#xff1f;2.超时时间是如何确定的&#xff1f; 2.快速重传3.SACK4.D-SACK1.ACK丢失2.网络延迟 5.滑动窗口0.问题抛出1.发送方的滑动窗口2.如何表示发送方的四个部分&#xff1f;3.接收方的滑动窗口4.滑动窗口的完善理解 1.超时重传 1.什么是…

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起函数、线程切换函数、线程恢复函数、线程结束函数、线程结束判断函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换&#xff0c;使用的是ucontext_t结构体&#xff0c;和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体&#xff0c;并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

Splay 树简介

【Splay 树简介】 ● Treap 树解决平衡的办法是给每个结点加上一个随机的优先级&#xff0c;实现概率上的平衡。Splay 树直接用旋转调整树的形态&#xff0c;通过旋转改善树的平衡性。计算量小&#xff0c;效果好。 ● Splay 树的旋转主要分为“单旋”和“双旋”。 所谓“单旋”…

基于52单片机的AS608指纹密码锁电路原理图+源程序+PCB实物制作

目录 1、前言 2、实物图 3、PCB图 4、原理图 5、程序 资料下载地址&#xff1a;基于52单片机的AS608指纹密码锁电路原理图源程序PCB实物制作 1、前言 这是一个基于AS608STC89C52单片机的指纹识别和键盘密码锁。 里面包括程序&#xff0c;原理图&#xff0c;pcb图和实…

OpenNJet:云原生技术中的创新者与实践者

目录 引言OpenNJet介绍OpenNJet优势1. 性能无损动态配置2. 灵活的CoPilot框架3. 支持HTTP/34. 支持国密5. 企业级应用6. 高效安全 OpenNJet 编译与安装环境准备编译环境配置配置yum源yum 安装软件包创建符号连接修改 ld.so.conf 配置 编译代码 部署 WEB SERVER配置OpenNJet部署…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-13-按键实验

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…