
5. 并发多线程总结
小师兄.
语言学习开发路上的一个初学者。
展开
-
线程(一)两种传统方式创建线程:(thread、Runnable), 线程池方式ExcutorServicePool
两种传统传统方式创建:(thread、Runnable), 线程池方式ExcutorServicePool 传统方式创建线程:1、继承Thread类,重写run方法2、实现Runnable接口,覆盖接口中的run方法,然后将接口实现扔给Thread run方法探秘:Thread源码中的run方法,如下:@Over...原创 2018-09-17 17:47:11 · 271 阅读 · 0 评论 -
线程(八)线程池
一、线程池1、什么是线程池?答: 经常创建、启动销毁一个线程都是非常消耗时间的。 使用线程池进行管理和复用线程,提高程序效率。 面试答:Java线程池能带来的3个好处: 1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 3、提高线程的可管理性。线程是稀缺资源,如果无...转载 2018-10-30 13:31:55 · 178 阅读 · 0 评论 -
线程(九)join方法的简单介绍:
1、join方法的实现原理:join方法原理就是利用线程的wait方法等待操作:A线程中调用了B线程的join方法,则相当于在A线程中调用了B线程的wait方法,当B线程执行完(或者到达等待时间),B线程会自动调用自身的notifyAll方法唤醒A线程public final synchronized void join(long millis) throws Interrupted...原创 2018-10-30 14:22:47 · 190 阅读 · 0 评论 -
线程(十四)线程同步技术Semaphore
理解:Semaphore通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,我们可以自己设定最大访问量。它有两个很常用的方法是acquire()和release(),分别是获得许可和释放许可。 借用武哥的理解:Semaphore相当于一个厕所,我在造的时候可以想造几个坑就造几个坑,假如现在我就造了3个坑,现在有10个人想要来上厕所,那么每次就只能3个人上,谁最先抢到谁就进去,出来了...原创 2018-11-07 17:51:18 · 158 阅读 · 0 评论 -
线程(十五)volatile的使用及其原理(好文章!!!)
一、volatile的作用 在《Java并发编程:核心理论》一文中,我们已经提到过可见性、有序性及原子性问题,通常情况下我们可以通过Synchronized关键字来解决这些个问题,不过如果对Synchronized原理有了解的话,应该知道Synchronized是一个比较重量级的操作,对系统的性能有比较大的影响,所以,如果有其他解决方案,我们通常都避免使用Synchronized来解决问题...转载 2018-12-24 14:51:29 · 171 阅读 · 0 评论 -
线程(十六)Java内存模型之从JMM角度分析DCL
DCL,即Double Check Lock,中卫双重检查锁定。其实DCL很多人在单例模式中用过,LZ面试人的时候也要他们写过,但是有很多人都会写错。他们为什么会写错呢?其错误根源在哪里?有什么解决方案?下面就随LZ一起来分析问题分析我们先看单例模式里面的懒汉式:public class Singleton { private static Singleton singleto...转载 2019-01-10 09:33:58 · 195 阅读 · 0 评论 -
线程(十七)J.U.C之AQS:AQS简介
Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略(【死磕Java并发】—–深入分析synchronized的实现原理),但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的...转载 2019-01-10 09:51:38 · 181 阅读 · 0 评论 -
线程(十八)J.U.C之AQS:CLH同步队列
在上篇博客【死磕Java并发】—–J.U.C之AQS:AQS简介中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。CLH同步队列是一个FIFO双向队列,AQS依赖它来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node)并将其加入到CLH同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点唤醒(公平锁),使其...转载 2019-01-10 10:20:44 · 160 阅读 · 0 评论 -
为什么不推荐通过Executors直接创建线程池
通过Executors的方法创建出来的线程池都实现了ExecutorSerivice接口。常用的方法有 newFixedThreadPool(int Threads):创建固定数目的线程池。 newSingleThreadPoolExecutor():创建一个单线程化的Executor newCacheThreadPool():创建一个可缓存的线程池,调用execu...转载 2019-03-08 15:25:35 · 1056 阅读 · 0 评论 -
线程(七)原子操作
何谓原子性操作,即为最小的操作单元,比如i=1,就是一个原子性操作,这个过程只涉及一个赋值操作。又如i++就不是一个原子操作,它相当于语句i=i+1;这里包括读取i,i+1,结果写入内存三个操作单元。因此如果操作不符合原子性操作,那么整个语句的执行就会出现混乱,导致出现错误的结果,从而导致线程安全问题。因此,在多线程中需要保证线程安全问题,就应该保证操作的原子性,那么如何保证操作的原子性呢?其一当...转载 2018-10-30 11:54:47 · 470 阅读 · 0 评论 -
线程(六)多线程间数据共享
起多个线程时,分别执行不同的任务,如加减运行,一个线程负责增加increment, 一个线程用于减decrement:1、例子:public class MultiThreadShareData { public static void main(String[] args) { ShareData task = new ShareData(); //公共数据...原创 2018-10-30 11:04:59 · 253 阅读 · 0 评论 -
线程(二)定时器技术
传统定时器技术:(1)Timer类Timer下的方法有以下几个:返回值 方法名 void schedule(TimerTask task, long delay) void schedule(TimerTask task, long delay, long period) void schedule(TimerTask task, Date time...原创 2018-09-17 20:36:02 · 189 阅读 · 0 评论 -
线程(三)线程互斥技术synchronized
创建两个线程,观察并发时出现的错误:package 测试;public class TestThread { public static void main(String[] args) { Init(); } public static void Init() { //创建第一个线程 new Thread(n...原创 2018-09-18 10:12:10 · 185 阅读 · 0 评论 -
线程(四)线程范围内得数据共享
在日常工作中,经常会遇到起多个线程,同时起一个变量进入线程中对该变量进行一系列操作,而且不同得线程都需要分配一个初始化得参数变量,简单说:线程x--变量n解决此问题得方法即使用hash得key-value来解决,直接看代码package 测试;import java.util.HashMap;import java.util.Map;import java.util.Random...原创 2018-09-19 10:41:01 · 178 阅读 · 0 评论 -
线程(五)ThreadLocal解决线程范围内数据的共享及疑问?
1、该方法缺点是只能放入一个数据package 多线程;import java.util.Random;//ThreadLocal来完成线程范围内数据的共享public class pthread { private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>()...原创 2018-10-29 17:27:08 · 303 阅读 · 0 评论 -
线程(十)关于Callable和future的介绍:
1、Callable类似于Runnable,为线程设计。区别在于,callable有返回值future,而Runnable则不会有返回值,同时Runnable不会抛出异常。future用于记录线程是否完成,不能用于判断线程执行是否正确。关于callable实例:public class CallableAndFuture { public static void main(St...原创 2018-10-31 16:45:58 · 549 阅读 · 0 评论 -
线程(十一)两种传统传统方式创建:(thread、Runnable), 线程池方式ExcutorServicePool
传统方式创建线程:1、继承Thread类,重写run方法2、实现Runnable接口,覆盖接口中的run方法,然后将接口实现扔给Thread run方法探秘:Thread源码中的run方法,如下:@Overridepublic void run() { if (target != null) { target.run(); }}...原创 2018-10-31 17:08:37 · 140 阅读 · 0 评论 -
线程(十二)传统定时器技术
传统定时器技术:(1)Timer类Timer下的方法有以下几个:返回值 方法名 void schedule(TimerTask task, long delay) void schedule(TimerTask task, long delay, long period) void schedule(TimerTask task, Date time...原创 2018-10-31 17:13:46 · 165 阅读 · 0 评论 -
线程(十三)线程互斥技术synchronized
创建两个线程,观察并发时出现的错误:package 测试;public class TestThread { public static void main(String[] args) { Init(); } public static void Init() { //创建第一个线程 new Thread(...原创 2018-10-31 17:20:28 · 171 阅读 · 0 评论 -
如何合理设置线程池大小
要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析:任务的性质:CPU密集型任务、IO密集型任务、混合型任务。 任务的优先级:高、中、低。 任务的执行时间:长、中、短。 任务的依赖性:是否依赖其他系统资源,如数据库连接等。性质不同的任务可以交给不同规模的线程池执行。对于不同性质的任务来说,CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1的线程数,IO...转载 2019-07-11 15:59:20 · 1450 阅读 · 0 评论