随笔分类 -  并发编程系列

本系列博客设计了并发基础、线程安全性、安全发布对象,线程安全策略,J.U.C组件,线程池,高并发扩展等方面的内容
摘要:线程 调度CPU的最小单元,也叫轻量级进程LWP(Light Weight Process) 两种线程模型 用户级线程ULT:用户程序实现,不依赖操作系统核心,引用提供创建、同步、调度和管理线程的函数来控制用户线程 优点:不需要用户态/核心态切换,速度快 缺点:内核对ULT无感知,线程阻塞则进程(包 阅读全文
posted @ 2020-08-17 19:38 三杯然诺 阅读(249) 评论(0) 推荐(0) 编辑
摘要:AQS全称为AbstractQueuedSynchronizer,是并发容器中的同步器,AQS是J.U.C的核心,它是抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类都依赖它,如ReentrantLock、Semaphore、CyclicBarrier、Reentra 阅读全文
posted @ 2018-05-12 16:45 三杯然诺 阅读(403) 评论(0) 推荐(0) 编辑
摘要:什么是线程不安全的类呢? 如果一个类的对象同时被多个线程访问,如果不做特殊的同步或并发处理,很容易表现出线程不安全的现象,比如抛出异常、逻辑处理错误等,这种类我们就称为线程不安全的类 常见线程不安全的类有哪些呢 下图中,我们只画出了最常见的几种情况,我们常见的Collections集合都是线程不安全 阅读全文
posted @ 2018-05-08 20:53 三杯然诺 阅读(744) 评论(0) 推荐(0) 编辑
摘要:通常我们保证线程安全策略的方式有以下几种: a、不可变对象 b、线程封闭 c、同步容器 d、并发容器 不可变对象 可参考string类,可以采用的方式是将类声明为final,将所有成员都声明为私有的,对变量不提供set方法,将所有可变成员声明为final,通过构造器初始化所有成员,进行深度拷贝,在g 阅读全文
posted @ 2018-05-08 11:59 三杯然诺 阅读(779) 评论(0) 推荐(1) 编辑
摘要:什么是发布对象? 发布对象是指使一个对象能够被当前范围之外的代码所使用 什么是对象逸出? 对象逸出是一种错误的发布,指当一个对象还没有构造完成时,就使它被其他线程所见 逸出-demo 在此实例中Escape对象还没有构造完成,就访问了该对象的成员变量thisCanBeEscape,该类是线程不安全的 阅读全文
posted @ 2018-05-07 15:52 三杯然诺 阅读(467) 评论(0) 推荐(1) 编辑
摘要:什么是线程安全的类? 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要额外同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的 线程安全性包含哪些特性? 原子性:提供了互斥访问,同一时刻只能有一个线程对它进行操作 可见性:一个线程 阅读全文
posted @ 2018-05-07 10:46 三杯然诺 阅读(310) 评论(0) 推荐(1) 编辑
摘要:在atomic包中,大多数类都是借助unsafe类来实现的,如以下代码 incrementAndGet()方法的实现如下: 我们再继续深入getAndInt()方法,实现如下: 在以上代码中我们着重要说的是 compareAndSwapInt(var1, var2, var5, var5 + var 阅读全文
posted @ 2018-05-06 21:17 三杯然诺 阅读(766) 评论(0) 推荐(0) 编辑
摘要:本篇博客我们主要讲述J.U.C包下的atomic包,在上篇博客“并发模拟”的最后,我们模拟高并发的情形时出现了线程安全问题,怎么解决呢?其实解决的办法有很多中,如直接在add()方法上加synchronized关键字,还有一种就是用atomic包下的类来解决这个问题,这也是现在比较推荐的一种写法,下 阅读全文
posted @ 2018-05-05 18:23 三杯然诺 阅读(802) 评论(0) 推荐(0) 编辑
摘要:我们要如何模拟一个高并发的环境来检查我们的代码呢?一般常用的方式有三种:利用测试工具ab,利用jmeter,代码模拟。本篇博客着重要说的是代码模拟的实现方式。 在开始写代码之前我们首先了解一下J.U.C中特别重要的两个工具类:CountDownLatch、Semaphore CountDownLat 阅读全文
posted @ 2018-05-03 20:44 三杯然诺 阅读(707) 评论(0) 推荐(1) 编辑
摘要:相比于线程池,我们可能接触new Thread更多一点,既然有了new Thread我们为什么还要使用线程池呢? new Thread的弊端 a、每次new Thread新建对象,性能差 b、线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM(OutOfMem 阅读全文
posted @ 2018-04-30 20:25 三杯然诺 阅读(750) 评论(1) 推荐(0) 编辑
摘要:本篇博客主要讲述并发编程中的一些基础内容,并了解一下基本概念。 首先我们了解一下什么是并发? 同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替的换入或者换出内存,这些线程是同时“存在”的,每个线程都处于执行过程中的某个状态;如果运行在多核处理器上,此时,程序中的每个线程都将分配到 阅读全文
posted @ 2018-04-29 14:51 三杯然诺 阅读(496) 评论(0) 推荐(0) 编辑