- 浏览: 538992 次
- 性别:
- 来自: 杭州
最新评论
-
c__海棠依旧:
很强,对于我这个新手很容易理解,准们登录来给你点赞的!
BeanFactory和FactoryBean -
hudazheng:
很清晰!
X86、X64和X86_64区别 -
hugh.wang:
...
BeanFactory和FactoryBean -
CB00J:
...
Executor框架和线程池 -
Arbow:
请教一个问题。现在互联网业务的数据库通常用分片方式来连接一组数 ...
BoneCP源码——概述
文章列表
1、ArrayList
ArrayList是List接口最常见的实现,其实现是基于数组的方式实现,无容量的限制,ArrayList是非线程安全的。
如下代码为ArrayList的构造函数,当没有确定的容量大小时,默认长度为10:
private transient Object[] elementData;
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException( ...
集合是Java中是最常用的包,最常见的有Collection和Map两个接口的实现,Collection用于存放多个单对象,而Map用于存放Key-Value形式的键值对。
Collection中常见的又分两种常见类型的接口:List和Set,List支持存放重复的对象,而Set则不支持。List接口中常见的实现类有:ArrayList、LinkedList、Vector、和Stack;Set接口常见的实现类有HashSet、TreeSet;Map常见的接口有HashMap、TreeMap和HashTable,HashMap和HashTable的主区别是HashMap是非线 ...
Executor框架使用Runnable作为基本的任务表示形式,但是Runnable有一定的局限性:不能返回一个值或抛出一个受检查的异常。实际中很多任务都是存在延迟的,如执行数据库查询、从网络上获取资源或执行复杂计算先进,对于这样的任务,Callable是一种更好的抽象:它认为入口(call)将返回一个值并并可能抛出一个异常。
Callable
定义:
package java.util.concurrent;
public interface Callable<V> {
V call() throws Exception;
}
返回 ...
线程池实现类ThreadPoolExecutor
ExecutorService接口扩展了Executor接口,添加了一些用于生命周期的管理方法,ThreadPoolExecutor继承了AbstractExecutorService,而AbstractExecutorService又实现了ExecutorService接口。
ThreadPoolExecutor的通用构造函数为:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
...
简介
在JDK5后主要提供的多线程处理都在java.util.concurrent包中,多线程的主要抽象不是Thread,而是Executor,Executor为接口,定义在java.util.concurrent包下,只定义了一个方法:
public interface Executor {
void execute(Runnable command);
...
Exchanger<V>,java.util.concurrent包下,
用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据,V
- 可以交换的对象类型。
构造方法
public Exchanger()创建一个新的 Exchanger。
方法摘要
V exchange(V x)
等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
V exchange(V x, long ti ...
CyclicBarrier在java.util.concurrent包下,是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用 ...
CountDownLatch类在java.util.concurrent包下,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计数到达0时,则 ...
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。
Semaphore实现的功能就类似厕所有5个坑,假如有十个人要上厕 ...
内置锁
Java提供了一种内置的锁机制来支持原子性:同步代码块(synchronized 关键字 ),同步代码块包含两部分:一个作为锁的对象的引用,一个作为由这个锁保护的代码块。
synchronized {
//代码块
}
每个Java对象都可以用做一个实现同步的锁,这些锁被秒为内置锁(Intrinsic Lock)或监视锁(Monitor Lock),线程进入同步代码块之前会自动获得锁,并且在退出同步代码块时怎释放锁,而且无论是通过正常路径退出锁还是通过抛异常退出都一样,获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。
内 ...
锁的劣势
Java在JDK1.5之前都是靠synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有守护变量的锁,都采用独占的方式来访问这些变量,如果出现多个线程同时访问锁,那第一些线线程将被挂起,当线程恢复执行时,必须等待其它线程执行完他们的时间片以后才能被调度执行,在挂起和恢复执行过程中存在着很大的开销。锁还存在着其它一些缺点,当一个线程正在等待锁时,它不能做任何事。如果一个线程在持有锁的情况下被延迟执行,那么所有需要这个锁的线程都无法执行下去。如果被阻塞的线程优先级高,而持有锁的线程优先级低,将会导致优先级反转(Pri ...
这个包里面提供了一组原子变量类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入,这只是一种逻辑上的理解。实际上是借助硬件的相关指令来实现的,不会阻塞线程(或者说只是在硬件级别上阻塞了)。可以对基本数据、数组中的基本数据、对类中的基本数据进行操作。原子变量类相当于一种泛化的volatile变量,能够支持原子的和有条件的读-改-写操作。
java.util.concurrent.at ...
JDK从1.5在多线程编程中提供了并发包java.util.concurrent,此包包括了几个小的、已标准化的可扩展框架,以及一些提供有用功能的类。主要代码由大牛Doug Lea完成,其实是在jdk1.4时代,由于java语言内置对多线程编程的支持比较基础和有限,所以他写了这个,因为实在太过于优秀,所以被加入到jdk之中。
concurrent包基本有3个package组成 java.util.concurrent:提供大部分关于并发的接口和类,如BlockingQueue,Callable,ConcurrentHashMap,ExecutorService, Semaph ...
Java多线程ThreadLocal类
- 博客分类:
- 多线程并发
一、ThreadLocal概述
JDK API 写道:
该类在java.lang包里,提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set
方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static
字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
API表达了下面几种观点:
1、ThreadLocal不是线程,是线程的一个变量,你可以先简单理解为线程类的属性变量。
2、ThreadLo ...
Java线程的生命周期
- 博客分类:
- 多线程并发
JVM把线程分为6种状态,分别是新建(New)、运行(Runnable)、无期限等待(Waiting)、一定时间的等待(Timed Waiting)、阻塞(Blocked)、结束退出(Terminated),如下图:
新建(New):
线程创建后还未启动
运行(Runnable):
包括了Ready和Running两种状态,也就是说此状态的线程可能在等待CPU执行权,也可能正在执行
无期限等待(Waiting):
处于此种状态的线程不会被分配CPU执行时间,它们要等待其它线程显示的唤醒,即调用notify()或notifyAll()方法。以下方法会让线程进入无 ...