ThreadLocal原理-编程思维

一、Thread public class Thread(){ //省略部分 //属于这个线程的ThreadLocals,这个map由ThreadLocal类维护 ThreadLocal.ThreadLocalMap threadLocals = null; //省略部分 } 二、ThreadLocal public class Thre

i++的原子性问题-编程思维

一、什么是原子性   简单的可以理解为:操作是不可再分割的,比如; int i=0; 但是i++的操作是可以再分的,比如: i++ //分解后 i=i+i 上面的代码在多线程环境下取值是有问题的,比如: package com.example.demo.juc; /** * @author DUCHONG * @since 2019-01-07 19:11 **/ publi

利用同步辅助类CountDownLatch计算多线程的运行时间-编程思维

一、CountDownLatch   jdk提供的一个同步辅助类,在完成一组在在其他线程中执行的操作前,允许一个或者多个其他的线程等待,通过调用 await() 方法阻塞,直到由于 countDown() 方法的调用而导致当前计数达到零,之后所有等待线程被释放。 二、计算多个线程执行时间 package com.example.demo.juc; import java.util.concu

利用Condition实现多线程交替执行-编程思维

一、需求 A、B、C 三个线程,循环10次,打印出自己的名称,ABC,ABC,ABC... A、B、C 三个线程,循环10次,打印出自己的名称,A一次,B三次,C五次,ABBBCCCCC,ABBBCCCCC 1.1、循环打印ABC package com.example.demo.juc; import java.util.concurrent.locks.Condition; impo

多线程-并发卖票-编程思维

package test; /** * author:songyan * date: 2019/11/10 **/ public class demo1 { public static void main(String[] args) { Tickert t = new Tickert(); Thread t1 = new Thread(t);

多线程-同步函数-编程思维

在上文的并发卖票中使用的同步代码块保证数据安全,也可以采用下面方式(同步函数): package test; /** * author:songyan * date: 2019/11/10 **/ public class demo1 { public static void main(String[] args) { Tickert t = new Ticke

Java多线程系列——线程池原理之 ThreadPoolExecutor-编程思维

ThreadPoolExecutor 简介 ThreadPoolExecutor 是线程池类。 通俗的讲,它是一个存放一定数量线程的线程集合。线程池允许多个线程同时运行,同时运行的线程数量就是这个线程池的容量,也会有一部分线程出现阻塞,线程池此时也会通过响应的拒绝策略来处理。 构造函数参数说明 corePoolSize:池中所保存的线程数,包括空闲线程 maximumPoolSize:池中允

Future 模式简介-编程思维

简介 Future 模式是多线程开发中的一种常见设计模式,它的核心思想是异步调用。 比如我们在网上购物,付款后就会产生一个订单,之后你该干嘛干嘛,快递小哥会上门送货,而不必像在超市结账那样,付款后要等着收银员打出小票再帮你打包商品,这个时间你只能站那等着。 总的来说,Future 模式无法立即给出你想要的结果,但它会给你一个契约,之后你可以随时通过这个契约来获取你想要的结果。 例子 下边举个简单

Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例-编程思维

简介: CountDownLatch 是一个非常实用的多线程控制工具类,通常用来控制线程的等待,它可以让某个线程等待直到倒计时结束 CountDownLatch 提供了两个主要的方法,await()、countDown()。 await:使当前线程阻塞,等待计数器为 0 countDown:计数器减一,计数为零时,释放所有在等待的线程 实例: public class CountD

Java多线程系列——线程池简介-编程思维

什么是线程池? 为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用。用线程时从线程池中获取,用完以后不销毁线程,而是归还给线程池。 JDK 对线程池的支持 为了更好的控制多线程,JDK 提供了一套线程池框架,结构如下图所示 它们都在 java.util.concurrent 包中。 Executor 用来执行任务,它提供了 execute() 方法来执行 Runnable 任务;

Java多线程系列——从菜鸟到入门-编程思维

持续更新系列。 参考自Java多线程系列目录(共43篇)、《Java并发编程实战》、《实战Java高并发程序设计》、《Java并发编程的艺术》。 基础 Java多线程系列——过期的suspend()挂起、resume()继续执行线程 Java多线程系列——sychronized Java多线程系列——Volatile关键字详解 Java多线程系列——ThreadLocal的深入理解 锁 Java

Java多线程系列——深入重入锁ReentrantLock-编程思维

简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为“独占锁”。 ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychronized,是实现锁的关键)来实现锁的获取与释放。 其可以完全替代 synchronized 关键字。JDK 5.0 早期版本,其性能远好于 synchronized,但 JDK 6.0 开始,JDK 对 synch

Java多线程系列——过期的suspend()挂起、resume()继续执行线程-编程思维

简述 这两个操作就好比播放器的暂停和恢复。 但这两个 API 是过期的,也就是不建议使用的。 不推荐使用 suspend() 去挂起线程的原因,是因为 suspend() 在导致线程暂停的同时,并不会去释放任何锁资源。其他线程都无法访问被它占用的锁。直到对应的线程执行 resume() 方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。 但是,如果 resume() 操作

Java多线程系列——信号量:Semaphore-编程思维

简介 信号量为多线程协作提供了更为强大的控制方法。也可以说,信号量是对锁的扩展。无论是内部锁 synchronized 还是重入锁 ReentrantLock,一次都只允许一个线程访问一个资源,而信号量却可以指定多个线程,同时访问某一个资源。 其构造函数如下: 常用方法: public void acquire() // 尝试获得一个准入的许可。若无法获得,则线程会等待,直到有线程释放一个

Java多线程——Condition条件-编程思维

简介 Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法。 不同的是,Object中的wait(),notify(),notifyAll()方法是和"同步锁"(synchronized关键字)捆绑