![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发编程
文章平均质量分 87
奋斗的小媛
这个作者很懒,什么都没留下…
展开
-
Java程序死锁问题定位与解决
一、概述死锁是指两个或两个以上的进程在执行过程中,因争抢资源而造成的一种互相等待的现象,若无外力干涉它们将无法推进,如果系统资源充足,进程的资源请求能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。死锁产生的原因:【1】系统资源不足;【2】资源分配不当;【3】进程运行推进的顺序不合适;形成死锁的四个必要条件:**【1】互斥条件:**一个资源每次只能被一个进程使用。**【2】请求与保持条件:**一个进程因请求资源而阻塞时,对已获得的资源保持不放。**【3】不剥夺条件:*原创 2021-05-12 00:13:30 · 290 阅读 · 1 评论 -
AQS 锁核心类详解
AQS(AbstractQuenedSynchronizer 抽象队列同步器) 是一个用来构建锁和同步器的框架,使用 AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于 AQS的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。当然,我们自己也能利用 AQS非常轻松容易地构造出符合我们自己需求原创 2021-04-27 23:38:02 · 302 阅读 · 0 评论 -
ReentrantLock 锁详解
ReentrantLock 支持公平锁和非公平锁,可重入锁 ReentrantLock的底层是通过 **AQS[链接]**实现。一、BAT 大厂的面试题**【1】**什么是可重入,什么是可重入锁? 它用来解决什么问题?【2】ReentrantLock 的核心是 AQS,那么它怎么来实现的,继承吗? 说说其类内部结构关系。【3】ReentrantLock 是如何实现公平锁的?【4】ReentrantLock 是如何实现非公平锁的?【5】ReentrantLock 默认实现的是公平还是非公平锁.原创 2021-04-27 23:13:55 · 3356 阅读 · 7 评论 -
Synchronized原理分析
Synchronized原理分析加锁和释放锁的原理深入JVM看字节码,创建如下的代码:1 public class SynchronizedDemo2 {2 Object object = new Object();3 public void method1() {4 synchronized (object) {5 6 }7 }8 }使用 javac命令进行编译生成 .class文件>javac Synchronize原创 2021-04-25 20:17:54 · 258 阅读 · 0 评论 -
ThreadLocal 类
ThreadLocal 并不是一个Thread,而是 ThreadLocalVariable(线程局部变量)。也许把它命名为 ThreadLocalVar更加合适。线程局部变量就是为每一个使用该变量的线程都提供一个变量值的副本,是 Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。ThreadLocal是除了加锁这种同步方式之外的另一种保证多线程访问出现线程不安全的方式。从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动原创 2021-04-19 22:41:55 · 241 阅读 · 0 评论 -
线程池核心线程数参数配置
线程池参数配置1.根据list大小创建核心线程数 最大不超过5个int poolSize = Math.min(model.getXProductInfoList().size(), 5);2.写死new ThreadPoolExecutor(2, 3, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(10));CompletableFuture.runAsync(() -> asynProcessXProductRe原创 2021-04-01 23:17:48 · 1043 阅读 · 0 评论 -
hashMap和ConcurrenHashMap底层实现
简介Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:下面针对各个实现类的特点做一些说明:(1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻转载 2021-03-21 13:25:19 · 431 阅读 · 0 评论 -
java面试---锁之Java乐观锁悲观锁、synchronized,重入锁 (ReentrantLock)处理并发(互斥同步、非互斥同步)
java里面的锁常用的都有哪些;常用的有synchronized(Object)、ReentrantLock(可重用锁)这些;synchronized修饰一个静态类和静态方法和修饰一个非静态方法有什么区别吗?Synchronized修饰非静态方法,俗称“对象锁”,要调用这个方法,必须创建这个对象,再来调用这个方法,因为一个类可以创建多个对象,而不同的对象就有不同的对象头,不同的对象头就...原创 2020-03-23 17:23:08 · 670 阅读 · 0 评论 -
ThreadLocal作用、场景、原理
1.ThreadLocal 是什么?在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。在JDK5.0中,ThreadLocal已经支持泛型,该类的类名已经变为ThreadLocal<T>。API方法原创 2020-09-03 23:12:48 · 161 阅读 · 0 评论 -
Java读写锁实现原理
最近做的一个小项目中有这样的需求:整个项目有一份config.json保存着项目的一些配置,是存储在本地文件的一个资源,并且应用中存在读写(读>>写)更新问题。既然读写并发操作,那么就涉及到操作互斥,这里自然想到了读写锁,本文对读写锁方面的知识做个梳理。为什么需要读写锁?与传统锁不同的是读写锁的规则是可以共享读,但只能一个写,总结起来为:读读不互斥,读写互斥,写写互斥,而一般的...转载 2020-04-15 22:13:30 · 199 阅读 · 0 评论 -
synchronized 锁的升级
synchronized 的基本认识在多线程并发编程中 synchronized 一直是元老级角色,很 多人都会称呼它为重量级锁。但是,随着 Java SE 1.6 对 synchronized 进行了各种优化之后,有些情况下它就并不 那么重,Java SE 1.6 中为了减少获得锁和释放锁带来的性 能消耗而引入的偏向锁和轻量级锁。synchronized 有三种方式来加锁1. 修饰实...转载 2020-04-11 17:49:49 · 113 阅读 · 0 评论 -
线程的五大状态
线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。1.新建状态当用new操作符创建一个线程时。此时程序还没有开始运行线程中的代码。2.就绪状态一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run...原创 2020-04-07 22:13:25 · 89 阅读 · 0 评论 -
线程的五大状态
线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。1.新建状态当用new操作符创建一个线程时。此时程序还没有开始运行线程中的代码。2.就绪状态一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run(...原创 2020-04-01 12:49:03 · 181 阅读 · 0 评论 -
谈谈Threadlocal(本地线程)
ThreadLocal是的作用是提供线程的局部变量。ThreadLocal的核心机制:每个Thread线程内部都有一个Map。ThreadLocalMap(ThreadLocal的静态类) Map里面存储线程本地对象(key)和线程的变量副本(value) 但是,Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。所以对...原创 2020-04-01 12:47:10 · 176 阅读 · 0 评论 -
多线程的三种实现方式以及线程池详解
1.继承Thread类;2.Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活。3.创建线程池线程池的原理;线程池它里面的主要参数有哪些;public ThreadPoolExecutor(int corePoolSi...原创 2020-04-01 12:24:10 · 1416 阅读 · 2 评论 -
java内存模型(Java Memory Model,JMM)
CPU的运行计算速度是非常快的,而其他硬件比如IO,网络、内存读取等等,跟cpu的速度比起来是差几个数量级的。而不管任何操作,几乎是不可能都在cpu中完成而不借助于任何其他硬件操作。所以协调cpu和各个硬件之间的速度差异是非常重要的,目前基于高速缓存的存储交互很好的解决了cpu和内存等其他硬件之间的速度矛盾,多核情况下各个处理器(核)都要遵循一定的诸如MSI、MESI等协议来保证内存的各个处理器高...原创 2020-04-01 12:08:30 · 118 阅读 · 0 评论 -
发生死锁的情况以及解决的办法
死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。 死锁的四个必要条件:互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程...原创 2020-04-01 12:04:24 · 214 阅读 · 0 评论 -
深入理解乐观锁与悲观锁
讲讲乐观锁和悲观锁;乐观锁:总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现version方式:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据...原创 2020-04-01 12:02:23 · 89 阅读 · 0 评论 -
synchronized和ReentrantLock区别
java里面的锁常用的都有哪些;常用的有synchronized(Object)、ReentrantLock(可重用锁)这些;synchronized修饰一个静态类和静态方法和修饰一个非静态方法有什么区别吗?Synchronized修饰非静态方法,俗称“对象锁”,要调用这个方法,必须创建这个对象,再来调用这个方法,因为一个类可以创建多个对象,而不同的对象就有不同的对象头,不同的对象头就...原创 2020-04-01 12:01:05 · 149 阅读 · 0 评论 -
发生死锁的情况以及解决的办法
死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。 死锁的四个必要条件:互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程...原创 2020-03-31 12:14:05 · 224 阅读 · 0 评论 -
Fork/Join框架 分而治之
什么是双亲委派机制当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。类加载器的类别BootstrapClassLoader(启动类加载器)c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader。由于引导类加载器涉及到虚拟机本地实现...原创 2020-03-31 00:31:15 · 141 阅读 · 0 评论 -
谈谈你对voliatle的理解
一、谈谈你对voliatle的理解1.voliatle是Java虚拟机提供的轻量级的同步机制保证可见性 不保证原子性 禁止指令重排2.JMM你谈谈(线程安全性得到保证)可见性 原子性 VolatileDemo代码演示可见性+原子性代码 package com.interview;import java.util.concurrent.TimeUnit;...原创 2019-08-15 16:44:02 · 928 阅读 · 0 评论 -
Java线程池实现原理及实践
Java线程池实现原理及其在美团业务中的实践随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程池遇到的问题,并给出了一种动态化线程池解决方案。1.1 线程池线转载 2021-03-02 22:14:20 · 305 阅读 · 0 评论 -
从ReentrantLock的实现看AQS的原理及应用
从ReentrantLock的实现看AQS的原理及应用前言Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。由于篇转载 2021-03-13 16:17:45 · 89 阅读 · 0 评论 -
Java面试--锁
Java面试–锁总体分类目录:1. 乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。先说概念。对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程原创 2021-03-13 15:34:07 · 97 阅读 · 0 评论