
并发编程
文章平均质量分 79
zlj1217
这个作者很懒,什么都没留下…
展开
-
生产者和消费者模型
基于synchronized的生产者/消费者模型其原理就是通过在获取到锁的wait/notify来实现的线程通信。@SuppressWarnings("all")public class ProviderConsumerWithSync { private Queue<Integer> queue = new LinkedList<>(); public static void main(String[] args) { ProviderCo原创 2021-07-23 12:26:06 · 301 阅读 · 1 评论 -
Lock接口使用及和synchronized的区别
关于锁的一些知识可重入锁如果锁具有可重入性,则称为可重入锁。synchronized和ReentrantLock都是可重入锁。其实可重入锁实际上表明了锁的分配机制:是基于线程的分配还是基于方法调用的分配。比如代码:class MyClass { public synchronized void method1() { method2(); } public synchronized void method2() {原创 2021-07-22 20:12:33 · 472 阅读 · 0 评论 -
一道题的思考
题目在小马哥的每日一问中看到了一道这个题:输出什么?。当时看错了在static块中的代码,就毫不意外的答错了= =,这个题其实没有看起来那么简单,这里去记录下这个题。小马哥这个每日一题的系列有很多比较"坑"的题,一般第一遍都比较难答对,推荐每天没事的时候可以去思否上看看这个题,也算拾遗一些基础~再来看看这个问题的代码:public class Lazy { private sta...原创 2019-08-04 18:16:08 · 356 阅读 · 0 评论 -
《并发编程艺术》中的线程状态
线程的状态线程的状态很早之前就理解过了,最近翻《并发编程艺术》的书时候,看到有个点之前理解的不太对。书中的线程状态分类new 初始状态,线程被构建,但是还没有调用start()方法runnable 运行状态,java中将操作系统中的就绪和运行两种状态笼统称作”运行中“(这里没有网上常见的Running状态)blocked 阻塞状态,表示线程阻塞于锁waiting 等待状态,表示线程进...原创 2019-02-24 14:54:20 · 212 阅读 · 0 评论 -
并发编程——基础拾遗
并发编程基础拾遗在看并发的书或者看并发相关的博客时,会发现一些知识点会遗漏或者之前没有看到,这里去总结一下。创建线程相关main线程我们通常会通过写main方法去创建多个线程,main线程是非守护线程,代表方法的入口。这个时候如果用jconsole去看的话,会发现这时也会启用很多后台线程:比如GC线程、计算引用线程、JMX线程。线程生命周期新建状态可运行状态运行状态阻塞状态...原创 2019-02-12 01:44:39 · 193 阅读 · 0 评论 -
并发编程——Thread API
这篇主要介绍Thread API,也是并发编程中的基础Thread一些常用API守护线程守护线程的概念和原理可以见:守护线程和非守护线程守护线程的一个应用:比如在做长连接的时候,需要一个心跳检查线程,这个线程就应该设置为后台线程,这样当整个连接关闭时,也会跟随连接线程消亡。这里可以在一个线程中再创建一个后台线程,来验证上述的这个应用:/** * 这里对后台线程提出一个问...原创 2019-02-22 01:16:53 · 219 阅读 · 0 评论 -
并发编程——并发基础:守护线程和非守护线程
前言最近在复习的时候,发现一个运行线程池拒绝策略demo中的main方法在运行了之后,进程并没有关闭。看了jconsole线程池中的线程都处于waiting状态。这里是跟我设置线程池的线程工厂中的设置线程是否为后台线程有关。后台线程和非后台线程后台线程,也叫守护线程,指的是在程序运行的时候后台提供一种通用服务的线程,比如jvm里垃圾回收线程,这种线程并不属于程序中不可或缺的部分。因此,当所有...原创 2018-11-27 00:40:58 · 1616 阅读 · 0 评论 -
并发编程——ThreadPoolExecutor源码分析(二)
前言在上一篇中,我们分析了ThreadPoolExecutor中关键变量ctl,这篇我们继续来看ThreadPoolExecutor中的构造函数及其参数。其中参数的相关解释来源于源码中的相关注释。构造函数我们可以看到ThreadPoolExecutor有四个构造函数:他们其实都是调用其中的全参数的构造函数,只不过有一些参数是使用了默认提供的参数。我们可以看一下构造函数:public ...原创 2018-10-16 09:56:45 · 379 阅读 · 0 评论 -
并发编程——ThreadPoolExecutor源码分析(一)
前言线程池是并发编程中最重要的应用之一,使用线程池可以防止大量的创建和销毁线程的过程,可以节省很多的内存空间,提高程序的响应率和cpu的利用率,并且也可以对线程进行统一管理和监控。这里将分几篇文章介绍一下线程池的源码分析。本篇是分析ThreadPoolExecutor中的ctl变量ctl变量源码中的解释ThreadPoolExecutor中有个字段是ctl,具体来说是对线程池的运行状态和池...原创 2018-10-05 22:45:54 · 399 阅读 · 0 评论 -
并发编程——ThreadLocal总结
概念介绍ThreadLocal是早期jdk版本中就有的一个工具,基本原理是同一个ThreadLocal所包含的对象(对ThreadLocal而言即为String类型变量),在不同的Thread中有不同的副本(实际是不同的实例)。这里有几点需要注意: - 因为每个Thread内有自己的实例副本,且该副本只能由当前的Thread使用。这也是ThreadLocal命名的由来。 ...原创 2018-08-17 16:58:50 · 263 阅读 · 0 评论 -
并发编程——线程基础(一)
线程是Java学习过程中比较难理解的一part,所以要好好打下基础,之后也会对juc包等其他并发编知识去做一个具体的原理性的学习。一些概念一、并发与并行并发:同一个时间间隔内做很多件事情;并行:同一个时刻同时做多件事情。其实对于这句话可以这样理解:并发是两个任务可以在重叠的时间段内启动、运行和完成。并行是任务在同一时间运行,例如,在多核处理器上,并发是独立执行过程的组合,而...原创 2018-08-04 15:01:58 · 209 阅读 · 0 评论 -
线程通讯之循环打印abc
循环打印abc有很多方法,这里去记录一种用条件变量condition去写的一种实现方法。package communication;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock...原创 2018-07-10 11:01:46 · 250 阅读 · 0 评论 -
并发容器之CopyOnWriteArrayList
前言Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArray...原创 2018-07-08 16:38:25 · 165 阅读 · 0 评论