Java并发编程
文章平均质量分 87
并发编程
童话ing
放弃不难,但坚持一定很酷。
展开
-
【JUC】多线程交替、循环、顺序打印问题?
文章目录方式一、Lock锁实现方式二、利用Synchronized锁实现方式三、利用Lock锁的Condition精准唤醒线程实现方式四、协同型打印3个线程依次打印1、2、3…这个问题,常常被作为面试题,题目如下:三个线程,一个线程负责打印1,4,7,……;第二个负责打印2,5,8,……,第三个负责打印3,6,9,……,要求在控制台中按顺序输出1,2,3,4,5,6……。事实上,这道题被作为了腾讯二面的一道题,如果没有复习过相关的知识,在面试中可能写出来千奇百怪。不过,这个题实现方式多种多样,如何原创 2021-06-06 21:26:24 · 356 阅读 · 1 评论 -
【JUC】ReentrantLock底层实现源码分析
一、前言 在Lock和Synchronized使用及二者区别一文中我们了解了Lock和Synchronized的简单使用,在上一篇文章关于synchronized底层实现原理、锁升级过程的那些事儿?中,我们了解了Synchronized底层实现原理,以及锁升级的详细过程。因此,在本文中,我们主要来介绍一下Lock锁。众所周知,Lock只是一个接口,在java.util.concurrent.locks包中有很多Lock的实现类,如ReentrantLock、ReadWriteLock(实现类Reen原创 2021-05-20 22:10:43 · 265 阅读 · 0 评论 -
【JUC】关于synchronized底层实现原理、锁升级过程的那些事儿?
文章目录一、前言知识二、表象分析三、Monitor实现3.1 获得锁3.2 释放锁3.3 引申问题四、synchronized锁优化4.1 无锁4.2 偏向锁4.2.1 偏向锁获取:4.2.2 偏向锁的释放:4.3 轻量级锁4.3.1 轻量级锁的加锁过程:4.3.2 轻量级锁的释放4.4 重量级锁五、自旋锁与适应性自旋六、锁粗化七、锁消除八、总结九、巨人的肩膀一、前言知识 众所周知,多线程并发环境下会出现原子性、可见性和有序性的问题。为解决这些问题,Java内存模型还提供了一系列原语,封装了底层实现后原创 2021-05-19 11:10:22 · 483 阅读 · 1 评论 -
【JUC】面试官再问我ThreadLocal,我就把这篇文章再看一遍
一、ThreaLocal到底是什么,有什么用? 话不多说,我们直接看 ThreadLocal 的源码说明,可以看到源码注释中有很清楚的解释:它是线程的局部变量,这些变量只能在这个线程内被读写,在其他线程内是无法访问的。 ThreadLocal 定义的通常是与线程关联的私有静态字段(例如,用户ID或事务ID)。 This class provides thread-local variables. These variables differ fromtheir normal counterpar原创 2021-05-18 11:28:22 · 252 阅读 · 2 评论 -
【JUC】面试 ConcurrentHashMap ,看这一篇就够了!
纯转载文章,方便复习观看。面试 ConcurrentHashMap ,看这一篇就够了!本文汇总了常考的 ConcurrentHashMap 面试题,面试 ConcurrentHashMap,看这一篇就够了!为帮助大家高效复习,专门用”★ “表示面试中出现的频率,”★ “越多,代表越高频!实现原理ConcurrentHashMap 的实现原理是什么? ★★★★★ConcurrentHashMap 在 JDK1.7 和 JDK1.8 的实现方式是不同的。先来看下JDK1.7JDK1.7 中的转载 2021-04-17 11:28:19 · 615 阅读 · 0 评论 -
【JUC】Java并发编程之JMM&volatile详解
本文大部分采用Java架构师必备技术:Java并发编程之JMM & volatile详解内容,这是我看过最全的JMM和Volatile讲解了,从中受益匪浅,但也有一些不足之处,因此,本文针对其中一些不足进行了完善。区分一下Java内存模型和Java内存结构,面的面试时候尬住。前者是多线程相关的,是一个约定——Java 的内存模型(JMM,Java Memory Model),而后者是JVM的内存划分。文章目录一、现代计算机理论模型与工作原理1.1 冯诺依曼计算机模型五大核心组成部分:1.2 CP原创 2021-04-14 11:05:51 · 353 阅读 · 0 评论 -
【JUC学习】——生产者消费者问题
生产者消费者问题用于很好的解释线程间通信的问题,大致意思可以解释为如果货架上物品为空,则通知生产者开始生产物品,如果货架上的物品满了,就通知消费者进行消费。在JUC中实现主要是通过synchronized和lock实现,对于synchronized,一般采用wait(等待)和notify(唤醒)进行线程的同步通信。在juc并发包下对应的lock方法为await和signal,同时使用资源监视器Condition来进行精准唤醒。一、Synchronized(wait和notify)下面看一下第一版的原创 2021-01-21 21:33:10 · 283 阅读 · 4 评论 -
【JUC学习】——线程池常见面试问题及基本使用案例
线程池是面试的热点,常见的面试问题如下:1、池化思想,还知道哪些地方池化技术? 程序的运行本质上来说就是占用系统的资源,频繁创建和销毁对象十分占用系统资源,因此使用池化技术优化资源的使用。池化技术我们接触的很多,比如数据库连接池, HTTP 连接池,Redis 连接池等。池化技术的思想: 核心思想是空间换时间,期望使用预先创建好的对象来减少频繁创建对象的性能开销,同时还可以对对象进行统一管理,减少对象使用成本。池化思想最大的作用是支持复用,避免出现空间过度使用出现内存泄露或者频繁垃圾回收等问题。2、原创 2021-01-20 21:47:48 · 625 阅读 · 5 评论 -
【JUC学习】——Lock和Synchronized使用及二者区别
众所周知,在JUC中常见的锁就是Lock和Synchronized了,主要是用于并发多线程的同步执行问题,用于在许多线程执行时对资源的限制。锁通常需要硬件支持才可以有效实施。这种支持通常采用一个或多个原子指令,测试单个线程是否空闲。Lock是显式加锁,锁释放。而synchronized是隐式锁,出了作用域自动释放,Lock只有代码块锁,synchronized有代码块锁和方法锁。使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类ReentrantLock()原创 2021-01-20 20:42:58 · 404 阅读 · 0 评论 -
【JUC学习】——线程的常见方法使用
线程的常见方法描述:序号方法功能1public void start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。2public void run()如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。3public final void setName(String name)改变线程名称,使之与参数 name 相同。4public fina原创 2021-01-19 20:30:30 · 163 阅读 · 0 评论 -
【JUC学习】——静态代理模式和Lambda表达式
我们根据加载被代理类的时机不同,将代理分为静态代理和动态代理。如果我们在代码编译时就确定了被代理的类是哪一个,那么就可以直接使用静态代理;如果不能确定,那么可以使用类的动态加载机制,在代码运行期间加载被代理的类这就是动态代理,比如RPC框架和Spring AOP机制。静态代理方式代理类和被代理类需要实现相同的接口。/** * 静态代理模式总结: * 真实对象和代理对象都要实现同一接口,代理对象要代理真实角色 * 好处: * 代理对象可以做很多真实对象做不了的事情 * 真实对象原创 2021-01-19 20:09:17 · 156 阅读 · 0 评论 -
【JUC学习】——线程创建的几种方式
Java的线程Thread位于java.lang包下,JUC表示的就是java.util.concurrent,java并发包下常用类的学习。文章来自狂神教学【狂神说Java】多线程详解一、线程创建的三种方式1、继承Thread类(不建议使用:避免OOP单继承局限性)步骤:继承Thread类,重写run方法。/** * Thread其实也是实现了Runnable接口 * 子类继承Thread类具备多线程能力,启动线程,子类对象.start() * 不建议使用:避免OOP单继承局限性 */原创 2021-01-19 19:49:33 · 184 阅读 · 0 评论