秋招准备-Java-并发编程-同步机制与synchronized(二)

秋招准备之——深入理解ConcurrentHashMap(JDK1.8) 秋招复习笔记系列目录(不断更新中): 1.数据结构全系列 2.计算机网络知识整理(一) 3.计算机网络知识整理(二) 4. Java虚拟机知识整理 5.计算机操作系统 6.完全理解HashMap 7.完全理解ConcurrentHashMap 一、前言 以前感觉HashMap难懂,直到我看了ConcurrentHashMap。。。不过,等真的读懂了源码,不得不感叹,Doug Lea大爷还是你大爷,看的过程中,不时惊呼:原来是这样啊!这也太牛了!好了,首先介绍一下,ConcurrentHashMap是一个 阅读详情

1.线程安全的一些概念

2.同步简述

3.synchronized的使用与说明


1.线程安全的一些概念

    1.正确性

        即某个类的行为与其规范完全一致,意思就是功能不能出错,使用多线程编程在带来性能提高的同时,也会由于多线程之间相互影响而导致的功能出错的情况,因此,线程安全,实际上就是确保,大到程序,小到类的方法的正确性,保证每个功能都按其设计的语义来实现,则可以说线程安全。

    

    2.原子性

        一个操作或多个操作,要么都执行,且执行过程不能被打断,要么就不执行,则为原子性。

        如对基本类型的访问和读写是原子性的。而“读取-修改-写入”(典型i++),“先检查后执行”(if语句)是非原子的

        原子操作是实现线程安全的一种,但一组原子操作的组合并不一定就是线程安全了,仍然需要一定的同步机制做确保。


    3.可见性

        指一个线程修改了共享变量的值,其他线程能够立即得知这个修改。

        主要通过原子类,volatile,synchronized来实现。


    4.有序性

        工作内存与主存同步延迟会导致可见性引起的线程不安全问题,而指令重排序则可能导致由有序性引起的线程不安全问题。

        指令重排序是一种JIT编译器的优化,目的是使处理器内部的运算单元能够尽量被充分利用,可能会将输入的代码进行乱序执行,(可以理解为a++;b++;会分到不同处理器一起执行,那么可能同时,也可能b++;在前。)



2.同步简述

    先从引起线程安全的问题讲起,大多数涉及线程安全的操作,都是基于这两点的。

    1.存在共享数据    2.存在多个线程访问使用共享数据

    因此在多个线程同一时段使用共享数据的时候,就有可能会因为相互干扰而导致出错。

    也许按我们自己写代码的顺序,按我们自己想要的各个线程之间执行的顺序,可以得到想要的结果。

    但是多线程在调用的时候,是受JVM来管理的,我们无法控制,因此,在基于几个线程的某种执行时序下,就有可能会导致错误的结果。

    而同步机制,其实就是通过它,来让线程按我们自己想要的执行顺序来执行,以确保线程安全。

    显然,保证线程安全并不全靠同步机制,从上述引起线程安全的两点来看,还有一些方法能够避开错误。如:

    1.如果不存在共享数据,同样可以使用多线程来实现多个只涉及自身的耗时操作的并发执行,以提高效率。

    2.使用自带的原子类,来实现共享数据的安全性。

    3.使用不可更改的共享数据,即共享数据属于不可变类。

    按我现在的理解,实际中,基本上就基于两点来考虑线程安全,1则是考虑数据线程私有,2则是考虑同步。并且最主要的也最清晰的方式,就是靠同步机制。

    而同步机制的主要实现,则是靠互斥实现-synchronized,与显示锁实现-Lock

    本章先介绍synchronized,下一站介绍Lock相关。



3.synchronized

    1.synchronized的使用方法

        主要即三种,synchronized代码块,synchronized方法,synchronized静态方法。

        其区别是加的锁对象不一样。

        synchronized有一个作用区域,且有一把锁,且锁是唯一的,只有持有锁,才能进入到作用区域,如果在申请锁时,发现锁已经被别的线程拿走了,就要进入阻塞且等待,直到那个拿锁的线程出作用区域的时候释放锁,然后阻塞状态的线程中的一个才能够获得锁进入作用区。

        synchronized的锁,是对象锁,即任何一个对象都有了一个新的作用,可以用来当锁,Object o = new Object(),那么对象o就可以用来当锁,且o是唯一的,Object o1 = new Object(),这样的o与o1,就是两把完全不同的锁,synchronized(o){……}这样就用o给这个代码块加上锁了,任何用o绑定的代码块,就都需要遵循synchronized的规则,进拿出放,申请拿锁,无则阻塞。

        理解完synchronized的对象锁,那么上述三种用法就是根据需求来用了。写一段实验代码:

public class Main
{
	private static Object o1 = new Object();
	private Object o2 = new Object();
	public static synchronized void staticFuncSyn() {
		try {
			Thread.sleep(2000);
		}catch(Exception ex) {}
		System.out.println("synchronized静态方法实现-对象锁的对象为:类锁Main.class");
	}
	public synchronized void funcSyn(){
		try {
			Thread.sleep(2000);
		}catch(Exception ex) {}
		System.out.println("synchronized方法实现-对象锁的对象:实例出来的对象");
	}
	public void func1() {
		synchronized(o1) {
			try {
				Thread.sleep(2000);
			}catch(Exception ex) {}
			System.out.println("synchronized代码块实现-对象锁的对象:静态对象o1");
		}
	}
	public void func2() {
		synchronized(o2) {
			try {
				Thread.sleep(2000);
			}catch(Exception ex) {}
			System.out.println("synchronized代码块实现-对象锁的对象:成员对象o2");
		}
	}
	public void func3() {
		synchronized(this) {
			try {
				Thread.sleep(2000);
			}catch(Exception ex) {}
			System.out.println("synchronized代码块实现-对象锁的对象:实例出来的对象");
		}
	}
	public static void main(String[] args)
	{
		Main A = new Main();
		Thread th1 = new Thread(new Runnable() {
			public void run() {
				A.staticFuncSyn();
			}
		});
		Thread th2 = new Thread(new Runnable() {
			public void run() {
				A.funcSyn();
			}
		});
		Thread th3 = new Thread(new Runnable() {
			public void run() {
				A.func1();
			}
		});
		Thread th4 = new Thread(new Runnable() {
			public void run() {
				A.func2();
			}
		});
		Thread th5 = new Thread(new Runnable() {
			public void run() {
				A.func3();
			}
		});
		th1.start();th2.start();th3.start();th4.start();th5.start();
		/**
		 * 结果:th1-th4两秒后同时打印,再过了两秒后th5才打印
		 */
	}
}

    2.synchronized的特点

        <1>通过JVM来执行,使用对象锁对代码块进行加锁,结构清晰,出方法块自动解锁。

        <2>阻塞的等待队列无法跳出,一旦拿锁线程不释放锁,则阻塞线程会无限等待下去。

        <3>提供单一的条件队列,通过wait()/notify()/notifyAll()实现中断唤醒机制

        <4>在jdk6以前,当并发量高时,由于大量线程阻塞会导致性能极具下降,而jdk6优化以后,synchronized的性能越来越好。


    3.synchronized的优化(jvm层面)

        锁粗化、锁消除

        偏向锁、轻量级锁、自旋锁

        (未……)

秋招突击——语法基础——Java的IO、多线程 真不同意,两点钟,一天内终于看完IO和多线程,继续加油,突击学会,好找工作。 阅读详情

相关推荐

【ERROR】ERROR1: PROJ: proj_create_from_database: Cannot find proj.db - 环境变量配置与路径修复指南

本文详细解析了地理空间数据处理中常见的【ERROR】ERROR1: PROJ: proj_create_from_database: Cannot find proj.db 错误。该错误的根源是PROJ库无法定位其核心数据文件proj.db。文章提供了从问题诊断到修复的完整指南,包括如何在不同系统(Windows/macOS/Linux)和安装方式(Conda/pip/源码编译)下找到正确的proj.db文件路径,并通过设置PROJ_LIB环境变量(临时、代码内或永久)彻底解决问题,同时给出了进阶排查技巧和

m2n3o4p5的博客 557

秋招准备--java

关于java,也不知道现在秋招有多卷,唉。

meloneatingguy的博客 499

液冷方式介绍

如果将直径在1~100nm的颗粒悬置在传热流体(例如:水、乙烯、乙二醇等)中时,其传热能力会得到提升,因为大多数固体材料的热导率要大于液体,因此由颗粒、流体组成的混合物热导率也高于液体本身的热导率,由此制成的流体,我们称之为纳米流体。金属冷管的液体工质蒸散量几乎为0,而柔软材质的管道则会产生液体的蒸散,在封闭式循环系统中,为了弥补液体工质的蒸散,必须定期在系统中补充液体工质。——我们之前说过,材料的导电和导热的机制大致是类似的,所以导电能力更强的金属往往具有更好的导热能力。

制冷技术咨询与服务的博客 2039

2022秋招必备(JAVA筑基之Netty、并发编程与设计模式)一次拿下!

2022年秋招就要来临,你准备的怎么样了?时间一下子就过去了,在秋招来临之前要多花时间去准备, 毕竟机会都是留给有准备的人的,还有些小伙伴想要明年的三四月份跳槽,这个时候也可以开始准备了,早点准备自己也更有信心,学习是一个漫长而艰难的过程,但是努力结果就不会辜负你的,今天会讲关于JAVA筑基之Netty、并发编程与设计模式,一起学习吧!机会都是留给有准备的人的,一起加油!java筑基之Netty、并发编程与设计模式。

weixin_62421895的博客 171

【论文复现】自动化细胞核分割与特征分析

HoVer-Net是一种精心设计的多分支深度学习网络架构,专为处理复杂的多组织显微图像中的细胞核实例分割与精确分类任务而开发。该网络通过创新的策略,不仅有效解决了细胞核在密集聚集区域难以准确区分的问题,还实现了对每个独立细胞核类型的细致分类。此外,HoVer-Net还引入了专门的上采样分支,这一设计旨在对每个成功分割出的细胞核实例进行进一步的核类型分类。这一分支利用高级语义信息,结合精心设计的分类策略,能够准确判断每个细胞核的所属类型,为医学研究提供了宝贵的细胞水平信息。

2201_75366661的博客 1978

【漏洞复现】永恒之蓝 MS17-010 远程溢出漏洞(CVE-2017-0143)

文章目录声明前言一、漏洞原理简述二、漏洞代码深层解析三、实验步骤四、漏洞补丁总结 声明 本篇文章仅用于技术研究与技术学习,切勿用于非授权下攻击行为,切记! 前言 Windows7 存在 MS17-010 永恒之蓝(远程溢出漏洞) ,该漏洞是方程式组织在其漏洞利用框架中一个针对SMB服务进行攻击的漏洞,该漏洞导致攻击者在目标系统上可以执行任意代码 一、漏洞原理简述 MS17-010漏洞出现在Windows SMB v1中的内核态函数 srv!SrvOs2FeaListToNt 在处理FEA(File Ex

李同學AI安全 9627

双非本科准备秋招(19.1)—— Synchronized优化

一个对象虽然有多线程加锁,但是加锁时间是的,那么可以用轻量级锁优化。语法还是synchronized,只是对使用者是透明的。首先,会先创建锁记录(Lock Record)对象,每个线程的都会包含一个锁记录的结构,内部可以存储锁定。然后,让锁记录中指向,并尝试用 cas 替换 Object 的 Mark Word,将 Mark Word 的值存 入锁记录替换分为成功和失败:替换锁记录中存储了对象的MarkWord,00代表轻量级锁,01代表无锁。替换当。

qq_62726880的博客 1181

快速入门必看!RT-DETR手把手训练自己的数据集去跑实验,基于 ultralytics 仓库源码改进,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。

本文介绍了使用Ultralytics框架训练RT-DETR模型的全流程。首先需要创建Python 3.10虚拟环境,安装指定版本的PyTorch和相关依赖包。然后准备数据集,修改配置文件,并详细介绍训练、验证和推理三个核心步骤的代码实现。训练阶段使用RTDETR类加载模型配置,设置训练参数;验证阶段评估模型性能;推理阶段可对图片、视频等进行预测。文中还提供了清华大学镜像源加速下载,以及详细的参数配置说明,帮助用户快速搭建RT-DETR目标检测模型。

Ai缝合怪、助力小伙伴高效发论文 5563

秋招准备之多线程

1. 多线程 知识点 Java多线程面试知识点汇总(超详细总结) java创建线程的三种方式及其对比 Callable也很重要 JAVA中线程同步的方法(7种)汇总 小知识点 java线程中yield(),sleep(),wait()区别详解 并发、并行、同步、异步、多线程的区别? JAVA多线程之线程间的通信方式 Java并发编程:深入剖析ThreadLocal Java多线程:线程安全...

dw33xn的博客 312

科研——ICONIP论文修改和提交

ICONIP说明文档

Blackoutdragon的博客 6647

使用openclaw出现blocked URL fetch (url-fetch) reason=Blocked: resolves to private/internal/special 解决方案

本文主要介绍了使用openclaw出现blocked URL fetch (url-fetch) target=https://news.google.com/search reason=Blocked: resolves to private/internal/special-use IP address 解决方案,希望能对使用xx的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

腾讯一面(正式开启秋招)

八月十二号,收到了腾讯一面,体验极好,为什么说是正式开启秋招呢,当时这个时间段是在实习中,突如其来的腾讯一面有点不知所措,是秋招的第一场面试,也是通过这场面试给自己敲醒了一个警钟,意识到自己基础的薄弱,一面问的不难,但是很多基础知识点像java锁、epoll和select的区别都没能答上来,虽然回答得很一般,但是面试官人很好,一直引导我,面试时长还是达到了50分钟左右,这一场面试虽然是凉凉,但是对于我的帮助是很大的,面试完之后,进行了总结复盘,也规划了复习路线,正式开启了秋招~~~ 以下附上面经: 讲一下

can_chen的博客 744

用 ADBC 把动态查询做得又快又稳:从 CL_SQL_STATEMENT 到安全取数的工程化实践

本文介绍了ABAP中ADBC(ABAP Database Connectivity)技术的核心用法与最佳实践。ADBC作为Open SQL的补充,适用于动态查询、数据库特性调用等场景。文章通过示例代码详细演示了使用ADBC执行查询的完整流程:创建SQL语句、执行查询获取结果集、批量装载数据到内表,以及分包读取处理大数据量。特别强调了动态SQL的安全防护措施,包括输入转义和参数绑定等防注入技术。同时对比了ADBC与Open SQL的适用场景,指出ADBC更适合需要动态访问数据库原生功能的场合。文章还分析了代码

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1773

秋招学习准备中!

明天就是网易校招笔试了准备一哈!开始自闭刷题模式 1.synchronized 关键字修饰代码块,修饰静态/非静态方法,并不能修饰类的属性。 2.linux软链接可以对目录进行链接(软连接即符号链接,还有硬链接,因为linux这块实在不懂,copy一下别人大神的一些精髓) 文件在Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。 用户数据,即文件数据块...

zzzzzzz的博客 402

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java大厂面试指南:性能优化+微服务+并发编程+开源框架+分布式

秋招面试已经过去有半个月了,我相信有人欢喜有人愁,大厂的面试题千奇百怪,不知道他会问到哪方面的知识点,我也是秋招大部队里面的一员,给大家整理出了18个大厂经常会问到200多道面试问题,涉及的知识点有,性能优化,微服务,并发编程,开源框架,分布式,等等。 文章内容过于全面,会涉及到部分知识点的解析,面试真题,学习思维路线。建议大家收藏。 同时有需要这些PDF原文档的朋友,可以关注小编+私信【架构资料】获取。 一,性能优化专题: 1.tomcat性能调优 怎么给tomcat调优 如何加大c.

javassb的博客 124

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

秋招信心满满去面美团,一连串的spring/并发/JVM把我直接问懵, 怀疑人生了!

二面大概50分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了(呜呜呜~)。回来之后把这些题目做了一个分类并整理出答案(强迫症的我~狂补知识~)分为spring,jvm,并发编程等,接下来分享一下我的这美团面试面经+一些我的学习笔记。 美团关于spring部分面试问题: Spring bean的生命周期能不能结合源码回答一下这个问题 Spring容器当中包含了哪些常用组件(至少说5个),作用是什么,场景是什么; Spring自动注入的原理是什么?能不能从源码来说明一下这个问

weixin_50205273的博客 205

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

直面秋招!BAT大厂Java面试真题锦集干货整理

蚂蚁金服关于spring部分面试问题: Spring bean的生命周期能不能结合源码回答一下这个问题 Spring容器当中包含了哪些常用组件(至少说5个),作用是什么,场景是什么; Spring自动注入的原理是什么?能不能从源码来说明一下这个问题; 我们常常说的自动注入,到底怎么注入的?有什么坑? Spring源码当中如何来搞定循环依赖的?Spring支持循环依赖? 如何来二次扩展Spring,比如自定义一个实现自动注入的注解; mybatis源码当中利用了Spirng的那些扩展?mybatis扩展Sp

CHAMPION8888的博客 176

秋招Java面试大纲:Java+并发+spring+数据库+Redis+JVM+Netty等

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的轨迹),还是钱给少了,不受重视。今天给大家分享下chenssy在这次跳槽中整理的Java面试大纲,其中大部分都是面试过程中的面试题,可以对照这查漏补缺,当然了,这里所列的肯定不可能覆盖全部方式。准备不充分的面试,完全是浪费时间,更是对自己的不负责(如果title很高,当我没说)。

javaAnPou的博客 238

[ 面 经 ]如何在 6月 中拿到offer 之 二 Java 并发

知识点:(1)与Object的wait/notify机制相比具有的特性;自己特别喜欢并发问题,所以,我答应自己在间隔月好好理一下并发的基础知识,算是给自己学生时代结束的礼物,我想,这一切就像是春日的阳光,温暖而静谧......最后,再多看看校园的梧桐。知识点:(1)重入锁的实现原理;

qq_72953326的博客 249

秋招面经——上海汉得Java(9.27)

我:假设有A、B两表,通过连接筛选条件得到结果,左连接是:A表与B表的重合部分加上A表未重合的部分;全连接是:AB两表重合的部分,加A表未重合的部分、加B表未重合的部分。我:首先对象创建是先存放在新生代中,然后经历gc没有被回收会晋升到生存者区,然后经历gc还没被回收且达到晋升条件,那就晋升到老年代,如果当中被gc回收了,那就结束了。equals只能用于比较两个对象是否相等,在没有重写equals方法时,和==相同,但在String类中重写了equals方法,是比较两者中的值是否相等。

student_hwj的博客 1367

2022Java多线程最全 面试题,为秋招做好准备

223.下面程序的运行结果()(选择一项)123456789101112 答案:B分析:启动线程需要调用start()方法,而t.run()方法,则是使用对象名.分析:启动线程需要调用start()方法,而t.run()方法,则是使用对象名.224.下列哪个方法可用于创建一个可运行的类()答案:AB分析: 继承Thread和实现Runable接口225.说明类java.lang.ThreadLocal的作用和原理。列举在哪些程序中见过ThreadLocal的使用?作用:要编写一个多线程安全(T

a6636656的博客 211

秋招面经

8月13日网易内推一面 Java并发包 1、线程池的实现原理(https://www.cnblogs.com/alimayun/p/9054027.html) Worker 循环从Queue中取线程执行。 LinkedBlockQueue 存 2、实现一个简单的线程池 3、ThreadLocal的实现原理 4、CountDownLatch的实现原理(https://blog.youkuaiyun.com/no...

m0_37817028的博客 373

双非本科准备秋招(18.2)—— 图解Monitor

java中对象存储结构分为(Header)、(Instance Date)和(Padding)。对象头存储着Mark Word和Klass Word,通过Klass Word,程序才知道这个对象是一个什么对象。Mark Word占32位。结构如下,有五种不同的类型,重点记一下:01偏向锁、00轻量级锁、10重量级锁。

qq_62726880的博客 945

JAVA面试大全〖四〗 JAVA基础

JAVA面试基础〖四〗一. 寄语二. 请你介绍一下map的分类和常见的情况 一. 寄语 大三了,也不能浪了,总得为下学期的秋招找个好点的工作啊,前提我得把基础再过一遍,这个寒假我会边学习边总结一些面试的基础问题~,能写完的我尽量写完,补充的尽量补充,干就完了,奥里给! ps.大部分找的题都是在牛客的面试经验里找来的,加上一些我自己的理解制作而成~~ 二. 请你介绍一下map的分类和常见的情况 1....

kingtok的博客 343

双非本科准备秋招(17.2)—— 线程八锁

一段代码块内存在对的多线程读写操作,这段代码就是临界区。:多个线程在临界区执行,由于代码不同导致结果无法预测,称发生了竟态条件。为了避免的此次使用阻塞式解决方案:synchronized,俗称,这样,同一时刻只能有一个线程能持有对象锁,其他线程想获得这个对象锁就会被阻塞。

qq_62726880的博客 530

秋招Java之经常被问到的底层原理+调优总结+ 特别的疑问的面试题

面试发现经常有些重复的面试问题,自己也应该学会记录下来,最好自己能做成笔记,在下一次面的时候说得有条不紊,深入具体,面试官想必也很开心。以下是我个人总结,请参考: HashSet底层原理:(问了大几率跟HashMap一起面) HashMap底层原理:(非常大几率问到) Hashtable底层原理:(问的少,问了大几率问你跟HashMap的区别) synchronized底层如何实现?锁优化...

睶 6595
上一篇: 秋招准备-Java-并发编程-多线程基础(一)
下一篇: 秋招准备-Java-并发编程-显式锁Lock(三)
LLLLLin0
博客等级 码龄11年 17粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值