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、同步器

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值