java并发知识点整理

1、锁对象

1.1、lock和condition(ReentrantLock())

Lock lock = new ReentrantLock();

lock.lock();

try {

...

} finally {

lock.unlock();

}

注意一定要释放锁,一般写在finally中。

1.2、可重入锁:线程可以重复的获取已经持有的锁,锁通过以及持有的计数器来跟踪对lock方法的嵌套

比如:一个类中定义一个类变量锁,类中的方法共用这个锁变量在实现同步,这时正一个方法中调用另外一个方法就会出现重入。

2、条件对象

线程进入临界区后,满足一定的条才可以继执行

Lock lock = new ReentrantLock();

Condition contidion = lock.newCondition();

lock.lock();

try {

while(signal) { //条件

condition.await();//阻塞在这里

...

condition.signalAll();//唤醒阻塞在这个条件上的所有线程,对于的condition.signal(),随机唤醒一个线程,有发生死锁的风险

}

...

} finally {

lock.unlock();

}

3、synchronized

作用于方法上:

synchronized method() {

while(signal) {

...

wait();

}

...

notify();/notifyall();

}

作用于代码块上:(客户端锁):使用每个java对象持有锁

Object o = new Object();

synchronized(o) {

...

}

3.1、每一个实例对象都有一个隐藏的锁对象以及相关的条件condition(内部的对象锁只有一个相关条件),不同实例对象之间的同步互不影响;

3.2、当把synchronized用在方法前,锁住的是该实例对象,一旦其他的其他线程方法该对象实例的任何其他被synchronized修饰的方法时都会阻塞,直到获得该对象锁的权限;

3.3、当synchronized修饰静态方法时,锁住的是该Class的类对象,会锁住该类所以被synchronized修饰的静态方法。

会不会锁住非静态的方法?

3.4、局限

不能中断一个正在试图获得锁的线程;

试图获得锁不能设置超时;

每个锁仅有单一的条件,可能不够;

最好既不使用lock/condi也不使用synchronized关键字,通过编发java.util.concurrent包下的安全类来实现自己的业务;

4、volatile域(用于修饰变量)

为实例域的同步访问提供了一种免锁机制

5、使用final修饰共享变量也可以实现安全的访问

6、原子性

7、死锁

死锁的四个必要条件:

8、线程局部变量(threadlocal)

ThreadLocal<String> local = new ThreadLocal<String>();

local.get();

local.set(T t);

local.remove();

9、读写锁

ReentrantLock lock= new ReentrantReadWriteLock();

Lock readLock = lock.readLock();

Lock writeLock = lock.writeLock();

10、为什么弃用thread的stop和suspend方法

stop用来终止一个线程;

suspend用来阻塞直到另外一个线程调用resume方法;

stop通过强制终止一个线程,当该线程处于执行过程中间时被终止,会造成对象的状态不一致;

终止一个线程安全的方式是通过中断的方式,让线程在安全的时候终止;

suspend可能造成死锁(调用suspend方法的线程试图获得同一个锁)

11、阻塞队列(BlockingQueue)

ArrayBlockingQueue:用数组实现的有指定容量和公平性设置的阻塞队列;

LinkedBlockingQueue:用链表实现的无上限的阻塞队列或双向队列;

DelayQueue:构造一个包含Delayed元素的无界的阻塞时间有限的阻塞队列;

ProiorityBlockingQueue:用堆实现无边界阻塞优先队列;

BlockingDeque:

操作

put:满阻塞

take:空阻塞

add:满抛异常IllegalStateException

element返回队列的头元素,空抛异常NoSuchElementException

remove移出并返回头元素,空抛异常NoSuchElementException

offer添加一个元素并返回TRUE,满返回FALSE

peek返回队列的头元素,空返回null

poll移出并返回队列的头元素,空返回null

12、线程安全的集合

ConcurrentHashMap实现原子性的插入和删除

ConcurrentSkipListMap有序的映射表

ConcurrentSkipListSet:有序集

ConcurrentLinkedQueue:安全无边非阻塞队列

13、写数组的拷贝

CopyOnWriteArrayList

CopyOnWriteArraySet

同步包装器类

Collections.synchronizedList();

Collections.synchronizedSet();

Collections.synchronizedsortSet();

Collections.synchronizedMap();
Collections.synchronizedSortMap()

Collections.synchronizedCollection();

14、Callable与Future

Runnable没有返回值,run方法

Callable有返回值,call方法

FutureTask包装器,实现Future和Runnable接口

15、执行器Executor

newCacheThreadPool:必要时创建新的线程,空线程保存60S;

newFixedThreadPool:固定数量的线程,空线程一直保留;

newSingleThreadExecutor:单线程

newScheduleThreadPool:为预定执行而构建固定数量的线程池,替代java.util.Timer

newSingleThreadScheduledExecutor为预定执行而构建的单线程;

ExetucorService:

submit()

控制任务组

invokeAny()

invokeAll()

ExecutorCompletion

16、fock-join框架

RecursiveTask接口compute方法

invokeall

join

17、同步器

猜你喜欢

转载自blog.csdn.net/l1394049664/article/details/81175810