Java并发
PORSCHE_GT3RS
这个作者很懒,什么都没留下…
展开
-
Java并发01----传统线程中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法;二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread。这两种方式大部分人可能都知道,但是为什么这样玩就可以呢?下面我们来详细分析一下这两种方法的来龙去脉。1. 揭秘Thread...原创 2018-03-22 21:44:55 · 220 阅读 · 0 评论 -
Java并发10--线程并发库的使用
1. 线程池的概念 在java5之后,就有了线程池的功能了,在介绍线程池之前,先来简单看一下线程池的概念。假设我开了家咨询公司,那么每天会有很多人过来咨询问题,如果我一个个接待的话,必然有很多人要排队,这样效率就很差,我想解决这个问题,现在我雇几个客服,来了一个咨询的,我就分配一个客服去接待他,再来一个,我再分配...转载 2018-05-04 00:28:05 · 216 阅读 · 0 评论 -
Java并发11--Callable与Future的应用
Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。而Callable可以返回一个结果,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子:...转载 2018-05-08 08:51:00 · 162 阅读 · 0 评论 -
Java并发12--线程锁技术的使用
线程锁好比传统线程模型中的synchronized技术,但是比sychronized方式更加面向对象,与生活中的锁类似,锁本身也应该是个对象。两个线程执行的代码片段如果要实现同步互斥的效果,它们必须用同一个锁对象。锁是上在代表要操作的资源的类的内部方法中,而不是线程代码中。这一篇博文主要总结一下线程锁技术中Lock...转载 2018-05-08 14:17:36 · 248 阅读 · 0 评论 -
Java并发18--线程同步工具Semaphore的使用
Semaphore通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,我们可以自己设定最大访问量。它有两个很常用的方法是acquire()和release(),分别是获得许可和释放许可。 官方JDK上面对Semaphore的解释是这样子的 : 一个计数信号量。从概念上讲,信号量维护了一个许可集。如...转载 2018-05-22 09:06:57 · 183 阅读 · 0 评论 -
Java并发19--并发工具CyclicBarrier的使用
上一节中总结了Semaphore同步工具的使用,Semaphore主要提供了一个记数信号量,允许最大线程数运行。CyclicBarrier是另一个同步工具,这一节主要来总结一下CyclicBarrier的使用。先看一下官方的对CyclicBarrier的介绍: 一个同步辅助类,它允许一组线程互相等待,直到到...转载 2018-05-22 10:37:37 · 205 阅读 · 0 评论 -
Java并发20--线程同步工具Exchanger的使用
如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使用的空间,就需要用到Exchanger这个类,Exchanger为线程交换信息提供了非常方便的途径,它可以作为两个线程交换对象的同步点,只有当每个线程都在进入 exchange ()方法并给出对象时,才能接受其他线程返回时给出的对象。 每次只能两个...转载 2018-05-23 00:20:48 · 256 阅读 · 0 评论 -
Java并发21 Executor简介
一 两级调度模型 在JVM的线程模型中,Java线程被一对一的映射为本地操作系统线程,Java线程启动会创建一个本地操作系统线程;当该Java线程终止时,这时操作系统线程也会被回收。操作系统会调度所有线程并将它们分配给可用的CPU。 在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor)将这些任务映射为固定数量的线程;在底层,...原创 2019-03-05 23:59:20 · 230 阅读 · 0 评论 -
Java并发23 线程池的使用
线程池的使用补:上篇文章中线程池中的全局锁问题使用线程池的目的线程池ThreadPoolExecutor详细介绍ThreadPoolExecutor简单使用补:上篇文章中线程池中的全局锁问题在上篇文章中,提到线程池在创建线程的时候需要获取全局锁,这里我们就看看源码,查看addWorker()方法private boolean addWorker(Runnable firstTask, boo...原创 2019-03-20 00:42:43 · 482 阅读 · 0 评论 -
Java并发22 线程池原理
线程池原理1.线程池处理流程2.execute()方法1.线程池处理流程当线程池提交一个新的任务时,线程池的处理流程如下:线程池判断核心线程池corePoolSize是否已满(是否都在执行任务),未满则创建线程执行任务;已满则下一步线程池判断工作队列BlockingQueue是否已满,未满则将任务放进队列;已满则下一步线程池判断池中线程数是否达到maximumPoolSize(所有线程...原创 2019-03-18 23:53:21 · 572 阅读 · 0 评论 -
Java并发24 再来一个例子来看看线程池执行过程
线程池执行过程一 直接上例子二 饱和策略一 直接上例子public class ThreadPoolExecutorTest { private static ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, new ArrayBlockingQueue&l...原创 2019-03-24 00:31:27 · 355 阅读 · 0 评论 -
Java并发09--原子性操作类的使用
在java5以后,我们接触到了线程原子性操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,本文总结一下Atomic系列的类的使用方法,其中包含: 类型 Integer Long 基本类型 AtomicInteger At...转载 2018-05-03 23:19:11 · 157 阅读 · 0 评论 -
Java并发08--多个线程间共享数据
先看一个多线程间共享数据的问题: 设计四个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1。 基于任务和线程分离的思想:多个线程之间共享数据主要关注两点就行:一是什么任务?几个任务?二是几个线程?记住 一点:几个任务和几个线程是没有关系的!100个线程可以执行一个任务,也可以执行...转载 2018-05-03 14:01:16 · 250 阅读 · 0 评论 -
Java并发17--理解线程池的原理
1.关于线程池线程池的技术背景在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的...转载 2018-05-10 02:04:55 · 268 阅读 · 0 评论 -
Java并发02---传统线程互斥技术——synchronized
在多个线程同时操作相同资源的时候,就会遇到并发的问题,如银行转账啊、售票系统啊等。为了避免这些问题的出现,我们可以使用synchronized关键字来解决,下面针对synchronized常见的用法做一个总结。首先写一个存在并发问题的程序,如下:public class TraditionalThreadSyn...原创 2018-03-22 21:56:46 · 222 阅读 · 0 评论 -
Java并发03---线程技术的死锁
我们知道,使用synchronized关键字可以有效的解决线程同步问题,但是如果不恰当的使用synchronized关键字的话也会出问题,即我们所说的死锁。死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 下面写一个死锁的例...原创 2018-03-22 22:02:07 · 223 阅读 · 0 评论 -
Java并发04---传统线程同步通信技术
先看一个问题: 有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次……如此往返执行50次。 看完这个问题,很明显要用到线程间的通信了, 先分析一下思路:首先肯定要有两个线程,然后每个线程中肯定有个50次的循环,因为每个线程都要往返执行任务50次,主线程的任务...原创 2018-03-29 23:02:22 · 187 阅读 · 0 评论 -
Java并发05---线程范围内的共享数据
假设现在有个公共的变量data,有不同的线程都可以去操作它,如果在不同的线程对data操作完成后再去取这个data,那么肯定会出现线程间的数据混乱问题,因为A线程在取data数据前可能B线程又对其进行了修改,下面写个程序来说明一下该问题:public class ThreadScopeShareData {...原创 2018-03-29 23:26:34 · 222 阅读 · 0 评论 -
Java并发06---ThreadLocal类以及应用技巧
上一节总结了一下,线程范围内的数据共享问题,即定义一个Map,将当前线程名称和线程中的数据以键值对的形式存到Map中,然后在当前线程中使用数据的时候就可以根据当前线程名称从Map中拿到当前线程中的数据,这样就可以做到不同线程之间数据互不干扰。其实ThreadLocal类就是给我们提供了这个解决方法,所以我们完全可以...原创 2018-03-29 23:40:18 · 184 阅读 · 0 评论 -
Java并发13--synchronized与lock的区别
引言:昨天在学习别人分享的面试经验时,看到Lock的使用。想起自己在上次面试也遇到了synchronized与Lock的区别与使用。于是,我整理了两者的区别和使用情况,同时,对synchronized的使用过程一些常见问题的总结,最后是参照源码和说明文档,对Lock的使用写了几个简单的Demo。请大家批评指正。技术...转载 2018-05-08 23:53:22 · 244 阅读 · 0 评论 -
Java并发07--造成HashMap非线程安全的原因
0. 写在前面 在前面我的一篇总结线程范围内共享数据文章中提到,为了数据能在线程范围内使用,我用了HashMap来存储不同线程中的数据,key为当前线程,value为当前线程中的数据。我取的时候根据当前线程名从HashMap中取即可。 因为当初学习HashMap和HashTable源码的时候,知道HashT...转载 2018-05-03 01:10:59 · 172 阅读 · 0 评论 -
Java并发14--sleep()和wait()的区别
结合synchronized,会更好的理解sleep()和wait()这两个方法,当然也就知道了他们的区别了。这篇博客就一起学习这两个方法sleep()sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu...原创 2018-05-09 23:07:11 · 405 阅读 · 0 评论 -
Java并发15--线程池的种类、区别和使用场景
newCachedThreadPool:底层:返回ThreadPoolExecutor实例,corePoolSize为0;maximumPoolSize为Integer.MAX_VALUE;keepAliveTime为60L;unit为TimeUnit.SECONDS;workQueue为SynchronousQueue(同步队列)通俗:当有新任务到来,则插入到SynchronousQu...原创 2018-05-10 00:29:23 · 673 阅读 · 0 评论 -
Java并发16--sleep(),wait(),yield()和join()方法的区别
sleep() sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级的线程得到执行机会。但是sleep()方法不会释放“锁标志”,也就是说如果有synchronized同步块,其他线程仍然不能...转载 2018-05-10 01:47:04 · 231 阅读 · 0 评论 -
Java并发25 ThreadFactory使用的必要性
ThreadFactory使用的必要性1.阿里编码规约扫描插件的友善提醒2.ThreadFactory的使用1.阿里编码规约扫描插件的友善提醒当我们构建一个线程池时,如果使用了阿里的编码规范扫描插件的话,会提醒我们要使用带ThreadFactory参数的ThreadPoolExecutor构造方法,Ctrl+F1进去我们会看到:之前的文章已经介绍了线程池中ThreadFactory用于设置...原创 2019-04-19 23:40:42 · 7130 阅读 · 0 评论