Java并发编程
文章平均质量分 75
Java并发编程
CodingALife
这个作者很懒,什么都没留下…
展开
-
Java并发基础(4-1):Java锁消除和锁粗化
锁粗化通常情况下,为了保证多线程间的有效并发,会要求每个线程持有锁的时间尽可能短,但是大某些情况下,一个程序对同一个锁不间断、高频地请求、同步与释放,会消耗掉一定的系统资源,因为锁的讲求、同步与释放本身会带来性能损耗,这样高频的锁请求就反而不利于系统性能的优化了,虽然单次同步操作的时间可能很短。锁粗化就是告诉我们任何事情都有个度,有些情况下我们反而希望把很多次锁的请求合并成一个请求,以降低短时间内大量锁请求、同步、释放带来的性能损耗。一种极端的情况如下: public void doS转载 2021-10-30 18:12:53 · 726 阅读 · 0 评论 -
Java并发基础(24):用户态/内核态
1、什么是用户态?什么是内核态?如何区分?一般现代CPU都有几种不同的指令执行级别。在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态。 低级别执行状态下,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动。举例:intel x86 CPU有四种不同的执行级别0-3,linux只使用了其中的0级和3级分别来表示内核态和用户态。 2、用户态和内核态的概念区别先看一个例子:1)例子 void testfo...原创 2021-10-30 17:52:04 · 314 阅读 · 0 评论 -
Java并发基础(24):Guava Service(服务)介绍
Guava包里的Service框架可以帮助我们把异步操作封装成一个Service服务。让这个服务有了运行状态(我们也可以理解成生命周期),这样我们可以实时了解当前服务的运行状态。同时我们还可以添加监听器来监听服务运行状态之间的变化。 Guava里面的服务有五种状态,如下所示:Service.State.NEW: 服务创建状态 Service.State.STARTING: 服务启动中 Service.State.RUNNING:服务启动完成,正在运行中 Service.State....转载 2021-02-01 15:41:51 · 1021 阅读 · 0 评论 -
Java并发基础(18):ExecutorService中submit方法详解
1 submit()submit( ):该方法接收Runnable或Callable对象作为输入参数(该方法输入参数请参考上篇文章java线程池任务提交(Runnable、Callable、FutureTask), 这篇文章主要讲submit方法的返回值以及返回值的使用),返回一个Future对象。submit方法提交的任务中的call方法如果返回Integer,那么submit方法就返回Future<Integer>;如果call方法返回Float,那么submit方法就返回Future&原创 2021-04-05 23:32:32 · 3020 阅读 · 0 评论 -
Java并发基础(17):Callable、Future和FutureTask
1、Callable<V>接口我们先回顾一下java.lang.Runnable接口,就声明了run()其返回值为void,当然就无法获取结果public interface Runnable { public abstract void run();}而Callable的接口定义如下public interface Callable<V> { V call() throws Exception;}该接口声明了一个...转载 2021-07-24 13:19:30 · 826 阅读 · 0 评论 -
Java并发基础(23):线程交替出现
https://www.cnblogs.com/youzhibing/p/14399143.html原创 2021-08-03 15:21:56 · 80 阅读 · 0 评论 -
Java并发基础(3):谈Happens-Before原则
https://segmentfault.com/a/1190000011458941转载 2021-09-20 23:51:59 · 226 阅读 · 0 评论 -
Java并发基础(15):CompletableFuture详解
https://www.jianshu.com/p/6bac52527ca4原创 2021-08-10 22:08:00 · 136 阅读 · 0 评论 -
Java并发基础(5):线程同步volatile和synchronized
1、Java线程的两个特性,可见性和有序性可见性:多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现。拿上篇博文中的例子来说明,在多个线程之间共享了Count类的一个对象,这个对象是被创建在主内存(堆内存)中,每个线程都有自己的工作内存(线程栈),工作内存存储了主内存Count对象的一个副本,当线程操作Count对象时,首先从主内存复制Count对象到工作内存中,然后执行代码count.increment(),改变了num值,最后用工作内存Count刷新主内存Count。当一个对转载 2021-07-21 19:47:01 · 358 阅读 · 0 评论 -
Java并发基础(16):线程池Executor框架
下一篇:线程池转载 2021-07-24 13:17:07 · 491 阅读 · 0 评论 -
Java并发基础(13):CyclicBarrier
1、CyclicBarrier:一个同步辅助类,用于协调多个子线程,让多个子线程在这个屏障前等待,直到所有子线程都到达了这个屏障时,再一起继续执行后面的动作。2、使用场景举例:年末公司组织团建,要求每一位员工周六上午8点【自驾车】到公司门口集合,然后【自驾车】前往目的地。在这个案例中,公司作为主线程,员工作为子线程。3、代码示例;package com.test.spring.support;import java.util.concurrent.BrokenBarrierExcept转载 2021-07-04 21:48:44 · 384 阅读 · 0 评论 -
Java并发基础(12):CountDownLatch理解
1、CountDownLatch:一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。2、ThreadPoolExecutor/ExecutorService:线程池,使用线程池可以复用线程,降低频繁创建线程造成的性能消耗,同时对线程的创建、启动、停止、销毁等操作更简便。3、使用场景举例:年末公司组织团建,要求每一位员工周六上午8点到公司门口集合,统一乘坐公司所租大巴前往目的地。在这个案例中,公司作为主线程,员工作为子线程。4、代码示例:package co转载 2021-07-04 21:47:29 · 109 阅读 · 0 评论 -
Java并发基础(10):LockSupport
1、LockSupport简介 LockSupport位于java.util.concurrent.locks包下。LockSupprot是线程的阻塞原语,用来阻塞线程和唤醒线程。每个使用LockSupport的线程都会与一个许可关联,如果该许可可用,并且可在线程中使用,则调用park()将会立即返回,否则可能阻塞。如果许可尚不可用,则可以调用 unpark 使其可用。但是注意许可不可重入,也就是说只能调用一次park()方法,否则会一直阻塞。LockSupport 类每个使用它的线程...转载 2021-07-26 16:29:41 · 576 阅读 · 0 评论 -
Java并发基础(9):Condition/Lock-线程通信更高效的方式
1、ConditionCondition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。下面将之前写过的一个线程通信的例子public class Test2 { //子线程循环10次,主线程循环100转载 2021-07-24 23:26:23 · 191 阅读 · 0 评论 -
Java并发基础(7):锁对象Lock、ReadWriteLock
1、Lock Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题public class LockTest { public static void main(String[] args) { final Output output = new Output(); new Thread() { ...转载 2021-07-24 22:27:22 · 299 阅读 · 0 评论 -
Java并发基础(6):ReentrantLock
ReentrantLock转载 2021-10-30 14:18:28 · 103 阅读 · 0 评论 -
Java并发基础(1):JMM
JVM基础(一): 内存详解_mingyuli的博客-CSDN博客_java内存原创 2021-10-30 14:13:54 · 151 阅读 · 0 评论 -
Java并发基础(2):volatile关键字
不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能。首先来看看为什么会出现这个关键字。内存可见性由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个线程都有着自己的工作内存(高速缓存)。线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存(效率提高),并且不能直接操作主内存以及其他线程工作内存中的数据,之后再将更新之后的数据刷新到主内存中。这里所提到的主内存可以简单认为是堆内存,而工作内存则可以认为是栈内存。转载 2021-06-14 22:44:49 · 153 阅读 · 0 评论 -
Java并发基础(8):AQS原理
1\转载 2021-10-14 16:44:57 · 154 阅读 · 0 评论 -
Java并发基础(14):CAS原理
CAS原理分析_漫步夕阳下的博客-CSDN博客_cas原理java并发之CAS详解 - StoneGeek - 博客园转载 2021-09-25 11:20:42 · 174 阅读 · 0 评论 -
Java并发基础(4):Synchronized原理和锁优化升级过程
自旋、偏向锁、轻量级锁、重量级锁区别_pocher的博客-CSDN博客Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级_tongdanping的博客-CSDN博客Java中Synchronized的用法_阳光日志-CSDN博客_synchronized【Java并发编程之深入理解】Synchronized的使用_青苔小榭-CSDN博客_synchronized深入理解Java并发之synchronized实现原理_zejian的博客-CSDN博客_synchro.转载 2021-09-25 11:01:38 · 2484 阅读 · 0 评论 -
Java并发基础(11):等效不可变对象CopyOnWriteArrayList
写在前面不可变类:是指一个对象一经创建就不再改变。 等效不可变对象:对象基本符合不可变对象的一些特征,但是某些情况下内部状态可能会改变1、非线程安全ListCollecrtion 集合中的ArrayList、LinkedList2、线程安全 ListCollecrtion 接口中的 Vector和Stack,位于java.util包 Collections 类中的SynchronizedList,位于java.util包 concurrent 包中的Copy...原创 2021-09-20 23:53:12 · 294 阅读 · 0 评论 -
Java并发基础(20):如何实现一个不可变类?
1、如何将一个类改造成不可变类?将一个类改造成不可变类,来解决线程安全问题。实现不可变类的一些思路: 使用final关键字修饰所有成员变量,避免其被修改,也可以保证多线程环境下被final关键字修饰的变量所引用的对象的初始化安全,即final修饰的字段在其他线程可见时,必定是初始化完成的。 使用private修饰所有成员变量,可以防止子类及其他地方通过引用直接修改变量值。 禁止提供修改内部状态的公开接口(比如我们前面例子中的setXY方法) 使用final修饰..原创 2021-09-19 15:05:10 · 746 阅读 · 0 评论 -
Java并发基础(21):多个线程读写同一共享变量是否存在并发问题?
1、原创 2021-09-18 22:58:03 · 4384 阅读 · 0 评论