Java并发问题
文章平均质量分 93
进程、线程、多线程、线程池、线程安全问题、并发工具类...
金鳞踏雨
断剑重铸之日,就是归来之时。
展开
-
【面试题】ThreadLocal 的底层原理与使用场景
ThreadLlocal 是 Java 中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意方法中获取缓存的数据。内存泄漏(线程池)当ThreadLocal对象使用完之后,应该要把设置的 key、value (即:Entry对象)进行回收,但线程池中的线程不会回收,而线程对象是通过强引用指向ThreadLocalMap,ThreadLocalMap也是通过强引用指向Entry对象,线程不被回收,Entry对象也就不会被回收,从而出现内存泄漏!!!原创 2023-07-25 01:36:11 · 129 阅读 · 0 评论 -
【面试题】notify() 和 notifyAll()方法的使用和区别
Java提供了两个方法和来唤醒在某些条件下等待的线程,但是Java中的notify和notifyAll之间存在当我们使用时,只有会被唤醒而且它不能保证哪个线程会被唤醒,这取决于。关于线程调度的算法如下:当我们使用时,那么,这些被唤醒的线程会去,谁先抢到谁就先执行,其它的就要继续等待!如何实现?在中调用即可!因此,notify和notifyAll之间的关键在于只会一个,而方法将所有。原创 2023-01-13 01:43:34 · 1204 阅读 · 0 评论 -
【并发】并发锁机制-深入理解synchronized(二)
Mark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机中分别为32bit和64bit,官方称它为“Mark Word”。对象头的另外一部分是klass类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。32位4字节,64位开启指针压缩或最大堆内存数组长度(只有数组对象有)如果对象是一个数组, 那在对象头中还必须有一块数据用于记录数组长度。原创 2023-01-12 13:05:40 · 519 阅读 · 0 评论 -
【并发】并发锁机制-深入理解synchronized(一)
这一篇文章主要介绍和其!我将会由浅入深带大家学习synchronized!多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件为了避免临界区的竞态条件发生,有多种手段可以达到目的:阻塞式的解决方案:synchronized(本章节重点),Lock。非阻塞式的解决方案:原子变量(Atomic原子类,CAS)原创 2023-01-10 13:36:06 · 500 阅读 · 0 评论 -
【并发】深入理解JMM&并发三大特性(二)
我们在上一篇文章中提到了JMM内存模型,并发的三大特性,其中对做了详细的讲解!这一篇文章,将会站在继续深入讲解的相关问题!【并发】深入理解JMM&并发三大特性(一)_面向架构编程的博客-CSDN博客。原创 2022-12-27 18:39:19 · 614 阅读 · 0 评论 -
【并发】深入理解JMM&并发三大特性(一)
并发三大特性是可见性、原子性和有序性!这就是并发的3个特性,它们同样也是并发编程Bug的源头!!!在并发编程中出现BUG,十有八九是这3个特性处理不当所导致的。Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果。原创 2022-12-24 03:16:30 · 751 阅读 · 1 评论 -
【并发】深度解析CAS原理与底层源码
CAS全称是(Compare And Swap,比较并交换),通常指的是这样一种原子操作(针对一个变量,首先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值)CAS可以看做是乐观锁(对比数据库的悲观、乐观锁)的一种实现方式,我们稍后要讲的Java原子类中的递增操作(i++)就通过CAS自旋实现的。CAS是一种无锁算法,在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步!原创 2022-12-10 20:21:17 · 672 阅读 · 0 评论 -
Java中的Unsafe的介绍与使用
Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。原创 2022-12-09 23:56:23 · 861 阅读 · 0 评论 -
【并发】Java并发线程池底层原理详解与源码分析(下)
这里只会打印会前30个任务(10+10+10=30),由于在3s内核心线程和临时线程都在忙碌中,队列也满了,按照ThreadPoolExecutor默认的策略会抛出异常!按照线程池的工作顺序,会先分配10个核心线程(1~10),再装满队列(11~20),最后分配临时线程(21~30);执行逻辑是核心线程和临时线程会先把“手头上”的任务处理完,才会去处理队列里的任务,这就是队列里的任务(11~20)最后打印的原因!!!原创 2022-11-27 20:31:01 · 425 阅读 · 0 评论 -
【面试题】深度解析Java多线程中的 run() 与 start() 有什么区别?
(1)使用 new Thread() 创建一个线程,然后调用 start0()方法进行 java层面的线程启动(2)调用本地方法start0(),去调用 JVM 中的JVM_StartThread方法进行线程创建和启动(3)调用 new JavaThread(&thread entry, sz) 进行线程的创建,并根据不同的操作系统平台调用对应的 os::reate thread 方法进行线程创建(4)新创建的线程状态为lnitialized,调用了sync->wait() 的方法进行等待,原创 2022-11-30 03:05:21 · 674 阅读 · 0 评论 -
【并发】Java并发线程池底层原理详解与源码分析(上)
线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。Executors 返回的线程池对象的弊端:1) FixedThreadPool 和 SingleThreadPool:允许的请求队列长度为 MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。2.CachedThreadPool:允许的创建线程数量为 MAX_VALUE,可能会创建大量建大量的线程,从而导致 OOM原创 2022-11-27 01:05:45 · 522 阅读 · 0 评论 -
【并发】深入理解Java线程的底层原理
操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。线程,有时被称为轻量级进程,是操作系统调度(CPU调度)执行的最小单位。Java 语言中线程共有六种状态,分别是:NEW(初始化状态)RUNNABLE(可运行状态+运行状态)BLOCKED(阻塞状态)WAITING(无时限等待)TIMED_WAITING(有时限等待)TERMINATED(终止状态)原创 2022-11-29 22:15:19 · 963 阅读 · 0 评论 -
Java多线程超详解总结
Java多线程我个人觉得是Java SE中最难的一部分,现在是2022.1.13,以下的部分是我的Java多线程的学习笔记,本篇文章将使用实例+图解+源码的方式来解析Java多线程。为什么要学习多线程???多线程好在哪里??? 程序运行的更快!!! 充分利用CPU资源,目前几乎没有线上的CPU是单核的,发挥多核CPU强大的能力 多线程的难点单线程只有一条执行线,过程容易理解,可以在大脑中清晰的勾勒出代码的执行流程,而多线程却是多条线,而且一般多条线之间有交互,多条线之间需要通..原创 2022-01-13 01:56:29 · 407 阅读 · 2 评论 -
Java多线程编程(七)——并发工具类
Hashtable出现的原因 : 在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了保证数据的安全性我们可以使用Hashtable,但是Hashtable的效率低下。原创 2022-01-13 01:55:08 · 7679 阅读 · 0 评论 -
Java多线程编程(六)——volatile、原子性
我们可以使用在Java的JDK1.5中提供的原子包——java.util.concurrent.atomic包这个包中的原子操作类提供了一种用法简单,性能高效,线程安全地更新一个变量的方式。因为变量的类型有很多种,所以在Atomic包里一共提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。原创 2022-01-11 17:56:51 · 711 阅读 · 0 评论 -
Java多线程编程(五)——线程池
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢?Java中的线程状态被定义在了java.lang.Thread.State枚举类中,State枚举类的源码如下:public class Thread { public enum State { /* 新建 */ NEW , /* 可运行状态 */ RU原创 2022-01-09 23:35:03 · 605 阅读 · 0 评论 -
Java多线程编程(二)——线程的常见方法
使用getName()获取线程的名字、Thread类中设置线程的名字、1.setName()更改线程的名字、2.通过构造方法更改线程的名字、获取当前线程的对象、线程的休眠、线程的优先级、线程调度、关于优先级的常见方法、守护线程\后台线程任何一个守护线程都是整个JVM中所有非守护线程的保姆;守护线程类似于整个进程的一个默默无闻的小喽啰;它的生死无关重要,它却依赖整个进程而运行;哪天其他线程结束了,没有要执行了,程序就结束了,理都没理守护线程,就把它中断了。原创 2022-01-05 23:56:39 · 659 阅读 · 0 评论 -
Java多线程编程(三)——线程锁
同步代码块解决数据安全问题、同步方法解决数据安全问题、同步方法的格式:、同步方法和同步方法块的区别:、同步静态方法、Lock锁原创 2022-01-06 13:03:03 · 2935 阅读 · 0 评论 -
Java多线程编程(一)——线程的3种实现方法
什么是多线程?是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能。并发与并行并发:在同一时刻,有多个指令在多个CPU上同时执行。并行:在同一时刻,有多个指令在单个CPU上交替执行。进程与线程 进程:是正在运行的程序 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位 动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的 并发性:任何进程都可以同其他进程一起并发执行原创 2022-01-05 18:21:24 · 531 阅读 · 3 评论 -
Java多线程编程(四)——死锁问题
死锁什么是死锁?线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行什么情况下会产生死锁?(1)资源有限(2)同步嵌套这里我们使用的是Lambda的写法Coding:package 多线程.ThreadDemo09_死锁;public class Demo { public static void main(String[] args) { Object objA = new Object().原创 2022-01-08 01:48:49 · 825 阅读 · 0 评论