----Java并发编程
文章平均质量分 82
syrdbt
这个作者很懒,什么都没留下…
展开
-
Reactor 网络模型、Java代码实例
在 I/O 多路复用的场景下,当有数据处于就绪状态后,需要一个事件分发器(Event Dispather),它负责将读写事件分发给对应的读写事件处理器(Event Handler)。原创 2024-06-15 15:43:13 · 965 阅读 · 2 评论 -
Java8 ConcurrentHashMap 存储、扩容源码阅读
ConcurrentHashMap 是线程安全且高效的 HashMap。原创 2024-05-12 22:58:14 · 885 阅读 · 0 评论 -
ReentrantLock源码阅读
lock锁, 基于AQS, 实现公平锁、非公平锁AQS可以阅读我这篇文章: 点击传送实现了Lock接口:2. 源码阅读2.1 属性2.2 构造函数构造函数:2.3 Sync队列同步器2.3.1 非公平尝试获取同步状态 nonfairTryAcquirestate为0● 直接CAS 尝试获取同步状态, compareAndSetState(0, acquires)● 成功设置当前线程占有锁 setExclusiveOwnerThread(current);当前线程已经获取锁:● sta原创 2024-04-14 20:35:20 · 408 阅读 · 0 评论 -
ThreadLocal核心源码阅读
ThreadLocal为每个使用该变量的线程提供独立的变量副本,因此每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。原创 2024-04-06 23:28:19 · 210 阅读 · 0 评论 -
AbstractQueuedSynchronizer 独占式源码阅读
*** 同步队列的头,懒惰地初始化。只能通过方法setHead修改* 注:如果Head存在,则保证其waitStatus不会已取消。*//*** 尾节点,enq 加入*//*** 同步状态*//*** 获取状态*//*** 设置状态*//*** CAS 设置状态*//***/原创 2024-03-23 17:50:29 · 837 阅读 · 0 评论 -
Java线程池ThreadPoolExecutor源码阅读
线程池先判断核心线程池是否已经已满,即工作线程数是否大于核心线程数,如果不是则创建核心工作线程执行该任务,否则下一步判断工作队列是否已经满了,如果队列没有满,则将该任务入队,否则进入下一步判断线程池中的线程是否已经满了,即是否大于最大线程数,如果不是则创建工作线程执行该任务,否则拒绝这个任务。原创 2024-03-10 18:54:27 · 903 阅读 · 0 评论 -
ArrayBlockingQueue 数组阻塞队列 源码阅读
数组阻塞队列。原创 2024-03-03 16:42:28 · 402 阅读 · 1 评论 -
Java 阻塞队列实现生产者和消费者场景
1. 阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。当阻塞队列满时,如果生产者线程使用put方法向队列中添加元素,队列会一直阻塞生产者线程,直到拿到数据,或者响应中断退出。当队列空时,消费者使用take方法从队列中获取元素,队列也会阻塞消费者线程,...原创 2020-02-26 12:08:14 · 801 阅读 · 0 评论 -
Java 使用 Callable 接口创建线程
使用 Callable 接口创建线程相较于实现Runnable接口方式的优点:可以有返回值,可以抛出异常。1.概述Callable接口的源码如下所示:@FunctionalInterface表名是一个函数式的接口,可以有返回值V (泛型),可以抛出异常throwsException。call方法类似Runnable接口中的run方法,作为线程的执行体。...原创 2019-07-19 11:06:51 · 500 阅读 · 0 评论 -
Java 中 Holder 方式 和 枚举方式 实现单例模式
Holder 方式 和 枚举方式可以线程安全的实现单例模式。Holder 方式借助于类加载的初始化阶段<clinit>()方法是同步方法。枚举方式是因为枚举类型不能继承且只能被实例化一次。1.Holder 方式实现单例模式类加载的初始化阶段<clinit>()方法是同步方法,在类中设置一个静态类,将唯一实例放在静态类中,第一次访问实例...原创 2019-06-26 18:49:10 · 3850 阅读 · 0 评论 -
JUC 可重入 读写锁 ReentrantReadWriteLock
原文地址:http://ifeve.com/juc-reentrantreadwritelock/转载自:并发编程网本文首先发表在码蜂笔记读写锁 ReadWriteLock读写锁维护了一对相关的锁,一个用于只读操作,一个用于写入操作。只要没有writer,读取锁可以由多个reader线程同时保持。写入锁是独占的。互斥锁一次只允许一个线程访问共享数据,哪怕进行的是只读操作;读写...转载 2019-06-18 16:58:50 · 173 阅读 · 0 评论 -
Java并发之AQS详解
原文地址:https://www.cnblogs.com/waterystone/p/4920797.html一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常...转载 2019-06-18 15:31:24 · 631 阅读 · 0 评论 -
Java并发之CAS (Compare and Swap)
CAS(Compare and Swap)比较并替换,CAS是实现乐观锁的一个重要操作。CAS 是一个硬件指令,保证是原子操作。 Java 中通过 UnSafe 来实现。 原子类: AtomicBoolean,AtomicInteger,AtomicLong 等使用 CAS 实现。1. 概述CAS的基本步骤:执行函数 CAS(V,E,N),如果V值等于E值,则将V的值设为...原创 2019-06-04 21:36:17 · 2104 阅读 · 12 评论 -
Java 并发工具类之 Semaphore
Semaphore控制访问特定资源的线程数量,新建规定数量的许可证,获得许可证可以继续执行,未获得需要阻塞,执行完成归还许可证,这样其余的线程(未获得许可证)才可以执行。例如:Semaphore用于流量控制,例如只有10个数据库连接,可以用Semaphore控制只有10个线程访问数据库,这样就不会报错无法获取数据库连接。1.Semaphore的部分方法方法 描述 pub...原创 2019-06-19 10:17:17 · 268 阅读 · 0 评论 -
Java 并发工具类之 CyclicBarrier
CyclicBarrier ,可循环(计数器可以重置)利用的同步屏障,线程到达一个屏障会阻塞,到达屏障的线程数达到设置的值时,所有被屏障阻塞的线程开始执行。1.概述构造函数:public CyclicBarrier(int parties),设置初始值。public CyclicBarrier(int parties, Runnable barrierAction),优先执行...原创 2019-06-18 21:49:43 · 258 阅读 · 0 评论 -
进程和线程的学习
1.概述进程:操作系统进行资源分配和调度的一个独立单位。线程:操作系统调度的基本单位。对计算机来说,每一个任务就是一个进程(Process),每一个进程内部中都至少有一个线程(Thread)是在运行,有时线程也被称为轻量级的进程。例如:启动一个Java虚拟机(JVM),操作系统就会创建一个新的进程(JVM进程),JVM进程中会派生或者创建很多线程。线程是程序执行的一个路径,每一个...原创 2019-04-21 10:46:34 · 426 阅读 · 0 评论 -
Java内存模型
原文地址:http://ifeve.com/java-memory-model-6/概述Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型。如果你想设计表现良好的并发程序,理解Java内存模型是非常重要的。Java内存模型规定了如何和何时可以看到由其他线程修改过后的共...转载 2019-04-26 20:07:03 · 115 阅读 · 0 评论 -
Java 的 synchronized 关键字
synchronized 关键字用来同步“方法”或者“代码块”,可以实现原子性,可见性,有序性。采取互斥机制,即在同一时刻,只能有一个线程访问同步资源,串行的执行“方法”或者“代码块”。缺点:缺点降低了线程的并发性;不能中断;多个锁交叉容易死锁。1.问题的引出多个线程在共享一个数据的时候会出现问题,如下所示,多个线程共同访问一个变量count,对count进行+1操作,开启了...原创 2019-04-27 21:13:53 · 347 阅读 · 0 评论 -
Java创建多线程的两种方式:继承Thread类和实现Runnable接口
继承Thread类:继承Thread类,再重写Thread类的Run方法,然后调用start()方法启动线程,启动线程后执行的是run方法。注意:多次启动线程(多次调用start()方法)是不合法的。实现Runnable接口:实现Runnable接口,再重写run方法,然后将这个实现类当做参数传给Thread类,例如:Thread dog = new Thread(runn,"小狗"),创建...原创 2019-04-20 11:44:10 · 14371 阅读 · 0 评论 -
Java 中的 sleep 方法
Sleep可以让当前线程进行休眠,有如下两个方法:public static void sleep(long millis) throws InterruptedException ,mills 毫秒 public static void sleep(long millis, int nanos) throws InterruptedException ,millis 毫秒, nan...原创 2019-05-11 11:03:35 · 41772 阅读 · 1 评论 -
Java 的 volatile 关键字学习
volatile关键字可以实现可见性和有序性。可见性:多个线程共享资源,一个线程修改共享资源,另外一个线程可以立即获得这个共享资源。 有序性:禁止对指令进行重排序。1.可见性当一个变量被volatile 关键字修饰,线程A写这个变量,先修改本地内存,但是会立即将刷新到主内存中,对接下来读这个变量的线程发送一个消息(共享变量已被修改,你的本地内存已经失效),其他线程去主内存中...原创 2019-05-11 16:04:13 · 189 阅读 · 1 评论 -
Java 中的Lock锁
Lock锁,可以得到和synchronized一样的效果,即实现原子性、有序性和可见性。相较于synchronized,Lock锁可手动获取锁和释放锁、可中断的获取锁、超时获取锁。Lock是一个接口,两个直接实现类:ReentrantLock(重入锁), ReentrantReadWriteLock(读写锁)。1.概述Lock锁,使用时手动获取锁和释放锁,比synchro...原创 2019-05-26 11:06:01 · 15860 阅读 · 0 评论 -
Java线程间协作的两种方式:wait、notify、notifyAll和Condition
原文地址:https://www.cnblogs.com/dolphin0520/p/3920385.html在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队...转载 2019-05-26 14:18:36 · 292 阅读 · 0 评论 -
Java 中 ThreadLocal 的使用
原文地址:ifeve.com/threadlocal使用/#more-21292转载自 :并发编程网 – ifeve.com1. 引言ThreadLocal的官方API解释为:“该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其get或set方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。Threa...转载 2019-05-26 16:31:43 · 258 阅读 · 0 评论 -
Java中的可重入锁
原文地址:http://ifeve.com/java_lock_see4/ 转载自 :并发编程网 – ifeve.com本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock。可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。在JAVA环境下 ReentrantLock 和synchronized...转载 2019-05-28 13:01:29 · 6023 阅读 · 1 评论 -
Java线程池的学习
线程池有如下四个优点:降低资源消耗:重用已经创建的线程,线程的创建和销毁需要消耗计算机资源,特别是在有大量创建线程请求且线程的处理过程是轻量级的,例如:大多数的服务器。 提高响应速度:重用已经创建的线程。 提高线程的稳定性:可创建的线程数量是由有限制的,限制值是有多个因素制约,例如:JVM启动参数,Thread构造参数的请求栈大小,底层操作系统对线程的限制。“ 为每一个任务分配一个线...原创 2019-05-31 22:48:13 · 323 阅读 · 1 评论 -
Java 读写锁 之 锁降级
锁降级 :是指保持住当前的写锁(已拥有),再获取读锁,随后释放写锁的过程。1.锁降级的用途举一个场景:数据不常变化,多个线程可以对数据进行并发的处理,如果当前线程感知数据变化,则进行数据处理操作,而其他线程则会被阻塞,直至当前线程完成数据的准备操作,这时候就需要使用锁降级。具体代码,update(是否更新的标志, false 标识可以更新,volatile修饰,使所有线程能够...原创 2019-06-18 19:47:03 · 4792 阅读 · 10 评论 -
Java 并发工具类 CountDownLatch
CountDownLatch 工具类可以初始一个计数值,在计数值为0之前,可以使用 await() 方法进行阻塞,调用countDown()方法该计数值减1。应用场景:一项大的工作,分成5份,计数值初始为5,每下载好一份,计数值减1,5份全部下好,计数值为0,开始执行await()之后的操作。1.概述构造函数,初始计数值为count :public CountDownLatch(...原创 2019-06-18 20:49:39 · 449 阅读 · 0 评论 -
Web 中同步、异步提交请求的具体实现方式
1. 同步和异步在web中的实例如果只用简单的form表单提交请求,网页会有一次闪烁(加载整个网页)然后才会返回结果,这是一种同步提交请求的方法,但是在使用Ajax之后 ,无需重新加载整个网页的情况下,能够更新部分网页,这是一种异步提交请求的方式,这里有一个Ajax的小例子。个人对同步、异步的理解如下。同步:有多个请求需要被处理,需要一个请求接着一个请求被处理,当前请求不...原创 2019-03-23 13:50:33 · 1203 阅读 · 0 评论