2017年3月23日

HashMap与ConcurrentHashMap的区别

摘要: 从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心。在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了。ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable。从ConcurrentHashMap代... 阅读全文

posted @ 2017-03-23 18:08 signheart 阅读(21997) 评论(0) 推荐(2) 编辑

java 多线程 27 :多线程组件之CountDownLatch

摘要: 前言在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码。之前讲过的线程池、BlockingQueue都是在java.util.concurrent下的组件,Timer虽然不在java.util.concurrent下,但也算是。后两篇文章将以例子的形式简单讲解一些... 阅读全文

posted @ 2017-03-23 18:07 signheart 阅读(896) 评论(0) 推荐(0) 编辑

java 多线程 28 : 多线程组件之 Semaphore 信号量

摘要: Semaphore是非常有用的一个组件,它相当于是一个并发控制器,是用于管理信号量的。构造的时候传入可供管理的信号量的数值,这个数值就是控制并发数量的,就是同时能几个线程访问。我们需要控制并发的代码,执行前先通过acquire方法获取信号,执行后通过release归还信号 。每次acquire返回成功后,Semaphore可用的信号量就会减少一个,如果没有可用的信号,acquire调用就会阻塞,等... 阅读全文

posted @ 2017-03-23 18:07 signheart 阅读(336) 评论(0) 推荐(0) 编辑

java 多线程 29 :多线程组件之 Exchanger

摘要: ExchangerExchanger,从名字上理解就是交换。Exchanger用于在两个线程之间进行数据交换,注意也只能在两个线程之间进行数据交换。线程会阻塞在Exchanger的exchange方法上,直到另外一个线程也到了同一个Exchanger的exchange方法时,二者进行数据交换,然后两个线程继续执行自身相关的代码。Exchanger只有一个exchange方法,用于交换数据。看一下例... 阅读全文

posted @ 2017-03-23 18:07 signheart 阅读(396) 评论(0) 推荐(0) 编辑

java 多线程 30: 多线程组件之 CyclicBarrier

摘要: CyclicBarrier接着讲多线程下的其他组件,第一个要讲的就是CyclicBarrier。CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到所有线程都达到了这个屏障时,再一起继续执行后面的动作。看一下CyclicBarrier的使用实例:public static class CyclicBarrierThread extends Thre... 阅读全文

posted @ 2017-03-23 18:07 signheart 阅读(341) 评论(0) 推荐(0) 编辑

java 多线程 33: 多线程组件之 Callable、Future和FutureTask

摘要: CallableCallable和rRunnable差不多,两者都是为那些其实例可能被另一个线程执行的类而设计的,最主要的差别在于Runnable不会返回线程运算结果,Callable可以(假如线程需要返回运行结果)FutureFuture是一个接口表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。Future提供了get()、cancel()、isCance... 阅读全文

posted @ 2017-03-23 18:07 signheart 阅读(228) 评论(0) 推荐(0) 编辑

多线程上下文切换优化与注意

摘要: 前言本文来自方腾飞老师《Java并发编程的艺术》第一章。并发编程的目的是为了让程序运行得更快,但是并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题,本文要研究的是上下文切换的问题。 什么是上下文切换即使是单核CPU也支持多线程执行代码,CPU通过给... 阅读全文

posted @ 2017-03-23 18:07 signheart 阅读(5479) 评论(0) 推荐(3) 编辑

java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现

摘要: java多线程15 :wait()和notify() 的生产者/消费者模式在这一章已经实现了 wait/notify 生产消费模型利用await()/signal()实现生产者和消费者模型一样,先定义一个缓冲区:public class ValueObject { public static String value = ""; }换种写法,生产和消费方法放在一个类里面:public c... 阅读全文

posted @ 2017-03-23 18:06 signheart 阅读(2445) 评论(0) 推荐(0) 编辑

java 多线程 23 : Timer

摘要: 前言定时/计划功能在Java应用的各个领域都使用得非常多,比方说Web层面,可能一个项目要定时采集话单、定时更新某些缓存、定时清理一批不活跃用户等等。定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程方式进行处理,所以它和多线程技术关联还是相当大的。那和ThreadLocal一样,还是先讲原理再讲使用,Timer的实现原理不难,就简单扫一下就好了。 更多关于调度任务的请参... 阅读全文

posted @ 2017-03-23 18:06 signheart 阅读(156) 评论(0) 推荐(0) 编辑

java 多线程 24 : 线程组

摘要: 线程组可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示: 线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织。 线程关联线程组:1级关联所谓1级关联就是父对象中有子对象,但并不创建孙对象。这种情况在开发中很常见,比如创建一些线程时,为了有效对这些线程进行阻止管理,通常情况下是创建一个线程... 阅读全文

posted @ 2017-03-23 18:06 signheart 阅读(330) 评论(0) 推荐(0) 编辑

java 多线程 25 :线程和线程组的异常处理

摘要: 线程中出现异常从上面代码可以看出来处理线程的异常设置异常的两种方式1.全局异常,也是静态异常,是个静态方法 , 类.setDefaultUncaughtExceptionHandler()2.对象一样,针对单个线程设置的异常,对象.setUncaughtExceptionHandler()ps:如果手动在线程内try catch了 那么就不会进入以上两种自己设置的异常了线程组异常从上面代码可以看... 阅读全文

posted @ 2017-03-23 18:06 signheart 阅读(415) 评论(0) 推荐(0) 编辑

java 多线程 26 : 线程池

摘要: 使用线程池与不使用线程池的差别先来看一下使用线程池与不适应线程池的差别,第一段代码是使用线程池的:public static void main(String[] args) { long startTime = System.currentTimeMillis(); final List l = new LinkedList(); ThreadPoolExecutor t... 阅读全文

posted @ 2017-03-23 18:06 signheart 阅读(273) 评论(0) 推荐(0) 编辑

java多线程17:ThreadLocal源码剖析

摘要: ThreadLocal源码剖析ThreadLocal其实比较简单,因为类里就三个public方法:set(T value)、get()、remove()。先剖析源码清楚地知道ThreadLocal是干什么用的、再使用、最后总结,讲解ThreadLocal采取这样的思路。 三个理论基础在剖析ThreadLocal源码前,先讲一下ThreadLocal的三个理论基础:1、每个线程都有一个自己的Thre... 阅读全文

posted @ 2017-03-23 18:05 signheart 阅读(216) 评论(0) 推荐(0) 编辑

java多线程18: ThreadLocal的作用

摘要: 从上一篇对于ThreadLocal的分析来看,可以得出结论:ThreadLocal不是用来解决共享对象的多线程访问问题的,通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是是线程自己要存储的对象,其他线程不需要去访问,也是访问不到的。各个线程中的ThreadLocal.ThreadLocalMap以及ThreadLocal.Thread... 阅读全文

posted @ 2017-03-23 18:05 signheart 阅读(282) 评论(0) 推荐(0) 编辑

java 多线程 19: ReentrantLock 与 Condition

摘要: ReentrantLockReentrantLock,一个可重入的互斥锁,它具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。ReentrantLock基本用法先来看一下ReentrantLock的基本用法:public class ThreadDomain38 { private Lock lock = new ReentrantLo... 阅读全文

posted @ 2017-03-23 18:05 signheart 阅读(152) 评论(0) 推荐(0) 编辑

java多线程20 : ReentrantLock中的方法 ,公平锁和非公平锁

摘要: 公平锁与非公平锁ReentrantLock有一个很大的特点,就是可以指定锁是公平锁还是非公平锁,公平锁表示线程获取锁的顺序是按照线程排队的顺序来分配的,而非公平锁就是一种获取锁的抢占机制,是随机获得锁的,先来的未必就一定能先得到锁,从这个角度讲,synchronized其实就是一种非公平锁。非公平锁的方式可能造成某些线程一直拿不到锁,自然是非公平的了。看一下例子,new ReentrantLock... 阅读全文

posted @ 2017-03-23 18:05 signheart 阅读(882) 评论(0) 推荐(0) 编辑

java多线程 21 : ReentrantReadWriteLock ,synchronized和ReentrantLock的对比

摘要: 读写锁ReentrantReadWriteLock概述大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务),但是效率非常低。所以在JDK中提供了一种读写锁ReentrantReadWriteLock,使用它可以加快运行效率。读写锁表示两个锁,一个是读操作相关的锁,称为共享锁;另一个是写操作相关的锁,称为排... 阅读全文

posted @ 2017-03-23 18:05 signheart 阅读(332) 评论(0) 推荐(0) 编辑

java多线程16:join()的使用

摘要: 讲解join()方法之前请确保对于即wait()/notify()/notifyAll()机制已熟练掌握。可以参考前面的笔记join()方法的作用是等待线程销毁。join()方法反应的是一个很现实的问题,比如main线程的执行时间是1s,子线程的执行时间是10s,但是主线程依赖子线程执行完的结果,这时怎么办?可以像生产者/消费者模型一样,搞一个缓冲区,子线程执行完把数据放在缓冲区中,通知main线... 阅读全文

posted @ 2017-03-23 18:04 signheart 阅读(699) 评论(1) 推荐(0) 编辑

java多线程15 :wait()和notify() 的生产者/消费者模式

摘要: 什么是生产者/消费者模型一种重要的模型,基于等待/通知机制。生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点:1、生产者生产的时候消费者不能消费2、消费者消费的时候生产者不能生产3、缓冲区空时消费者不能消费4、缓冲区满时生产者不能生产生产者/模型作为一种重要的模型,它的优点在于:1、解耦。因为多了一个缓冲区,所... 阅读全文

posted @ 2017-03-23 18:04 signheart 阅读(878) 评论(0) 推荐(0) 编辑

java多线程14 :wait()和notify()/notifyAll()

摘要: 轮询线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作。想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处理?一个办法就是,B线程while(i == 10000),这样两个线程之间就有了通信,B线程不断通过轮训来检测i == 10000这个条件。这样可以实现我们的需求,但是也带来了问题:CPU把资源浪费了B... 阅读全文

posted @ 2017-03-23 18:03 signheart 阅读(307) 评论(0) 推荐(0) 编辑

导航