本月博客排行
-
第1名
龙儿筝 -
第2名
lerf -
第3名
fantaxy025025 - johnsmith9th
- zysnba
- xiangjie88
年度博客排行
-
第1名
青否云后端云 -
第2名
宏天软件 -
第3名
gashero - wy_19921005
- vipbooks
- benladeng5225
- e_e
- wallimn
- javashop
- ranbuijj
- fantaxy025025
- jickcai
- gengyun12
- zw7534313
- qepwqnp
- 解宜然
- ssydxa219
- zysnba
- sichunli_030
- sam123456gz
- 龙儿筝
- arpenker
- tanling8334
- kaizi1992
- gaojingsong
- xpenxpen
- jh108020
- wiseboyloves
- ganxueyun
- xyuma
- xiangjie88
- wangchen.ily
- Jameslyy
- luxurioust
- lemonhandsome
- jbosscn
- mengjichen
- zxq_2017
- lzyfn123
- nychen2000
- forestqqqq
- wjianwei666
- ajinn
- zhanjia
- Xeden
- hanbaohong
- java-007
- 喧嚣求静
- kingwell.leng
- mwhgJava
最新文章列表
java的concurrent用法详解
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然
没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait()、
notify()和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性 ...
并发笔记-----------使用显示的Lock对象
java机制中除了用synchronized关键字来做同步一外。
还可以用java.util.concurrent.lock包中的类
Lock lock=new ReentrantLock()来代替synchronized同步锁
区别是:
使用synchronized 失败会抛出异常。
而使用Lock后可以finally{}讲系统维护在正确的状态
Lock对象必须被显示的创建,锁定和释放 ...
尽量把CyclicBarrier和CountDownLatch的区别说通俗点
先说两点都知道的:
1.CountDownLatch减计数,CyclicBarrier加计数。
2.CountDownLatch是一次性的,CyclicBarrier可以重用。
然后我们用被大家说烂了的跑步的例子继续说事儿:
1. 有五个人,一个裁判。这五个人同时跑,裁判开始计时,五个人都到终点了,裁判喊停,然后统计这五个人从开始跑到最后一个撞线用了多长时间。
import java.ut ...
DCL,volatile,Final
Double check lock模式的典型代码:
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if ...
线程池简单实现
其实线程池的实现就是生产者消费者问题
的实现,理解了生产者消费者问题
就不会对线程池的实现感到神秘了,线程池在很多地方会用到,比如
tomcat
等各种中间容器的实现,
Spring
对线程池的支持等,当然
mina
中也使用到了线程池的概念。
看下简单对线程池的实现代码,主要包括三个类,一个是线程池,一个是工作任务,一个是客户端进行任务添加。
任务类,比较简单,实现
...
同步器--Exchanger
用于实现两个线程间的数据交换,每个线程在完成一定的任务后想与对方交换数据,第一个先拿出数据的线程将一直等待第二个线程拿着数据到来时,才能彼些交换数据.
public class ExchangerTest {
public static void main(String[] args) {
final Exchanger<String> exchanger = new Exc ...
同步器--CountDownLatch
CountDownLatch像倒计时计数器,调用它的countDown()方法就将计数器减1,当达到0时,所有等待者开始执行,
可以实现一个人通知多人,如裁判,也可以实现一个计划要多个领导签字后才能继续向下实施的情况.
public class CountdownLatchTest {
public static void main(String[] args) {
ExecutorS ...
同步器--CyclicBarrier
/**
* 淘宝面试题:如何充分利用多核CPU,计算很大的List中所有整数的和
* @author weistar
*
*/
public class CountListIntegerSum {
private long sum;// 存放整数的和
private CyclicBarrier barrier;// 障栅集合点(同步器)
private List< ...
同步器--Semaphore
它可以维护当前访问自身的线程个数,并提供了同步机制,使用它可以控制同时访问资源的线程个数,如实现一个文件允许的并发访问数.
单个信号灯对象可以实现互斥锁的功能,并且可以是由一个线程获得了"锁",再由另一个线程释放"锁",可应用于死锁恢复的场合.
注:还有另一个构造器Semaphore(int permits, boolean fair),其中fair为tr ...
使用Condition实现多路等待通知
一个锁内部可以有多个Condition,即有多路等待和通知,可参考JDK1.5的Lock和Condition实现的可阻塞队列的应用案例,在传统的线程机制中一个监视器对象上只能有一路等待和通知,要想实现多路等待和通知,必须嵌套使用多个同步监视器对象.
使用Condition可简单实现多路等待通知
public class TwoConditionCommunication {
publi ...
使用readLock与writeLock实现缓存
锁妙用:
读写锁:分为读锁和写锁,多个读锁不能互斥,读锁与写锁互斥,写锁与写锁互斥,这是由JVM自己控制的,只要上好相应的锁即可,如果你的代码只读数据,可以多人同时读,但不能同时写,那就上读锁;如果要修改数据,只能有一个人在写,且不能同时读取,那就上写锁,总之,读的时候上读锁,写的时候上写锁.
如使用readLock与writeLock实现缓存
public class CacheDemo { ...
Callable与Future应用
应用于异步的任务执行,类似JS的回调方法.
Future取得的结果类型与Callable返回的结果类型必须一致.
如异步执行方式:
public class FutureTaskDemo {
public static void main(String[] args) {
// 初始化一个Callable对象和FutureTask对象
Callable<Object& ...
线程间通信
传统线程间通信
// 传统的线程通信
public class TraditionalThreadCommunication {
public static void main(String[] args) {
final Business business = new Business();
new Thread(new Runnable() {
@Override ...
多线程访问共享数据
多线程访问共享数据方式总结:
1.若每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,如卖票系统.
2.若每个线程执行的代码不同,这时需要用不同的Runnable对象,有以下几种方式来实现这些Runnable对象之间的数据共享:
2.1将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象,每个线程 ...
ThreadLocal数据共享与优雅设计
ThreadLocal用于实现线程内的数据共享,即对于相同的代码,多个模块在同一线程中运行时要共享一份数据,而在另外的线程中运行时又共享另外一份数据.
实现对ThreadLocal变量的封装,让外界不直接操作ThreadLocal变量,一是对基本类型的数据封装,这种应用相对少见,二是对对象类型的数据封装,较常见,即让某个类针对不同线程分别创建一个独立的实例对象.
以下是ThreadLocal常用 ...
AbstractQueuedSynchronizer(4)
Condition是一个条件功能的class,必须放在Lock代码块内,如同wait,notify方法放在synchronized块一样。
Condition的(await,signal)与object的(wait,notify)相比,提供了更为通用和灵活的解决方案,可以让多种条件的线程之间相互通信。
Condition的定义:
public interface Condition{ ...