有助于提高锁性能的几点建议
1、减少锁持有的时间——–只在必要时进行同步
2、减小锁的粒度
ConcurrentHashMap(只有获取全局信息的方法调用不频繁时,这种方法才能真正意义上提高系统吞吐量)
3、读写分离锁替代独占锁——–ReadWriteLock
4、锁分离的思想——–LinkedBlockingQueue take()、put()使用不同的锁
5、锁粗化
虚拟机在遇到一连串连续地对同一锁不断进行请求和释放的操作时,便会把所有的锁操作整合成对锁的一次请求,从而减少对锁的请求同步次数。
例如:
public void demoMethod(){
synchronized(lock){
//do sth
}
//做其他不需要同步的工作,但能很快执行完毕
synchronized(lock){
//do sth
}
}
会被整合成:
public void demoMethod(){
//整合成一次锁请求
synchronized(lock){
//do sth
//做其他不需要同步的工作,但能很快执行完毕
}
}
还有在循环内请求锁的时候,有必要对锁进行粗化:
for(int i=0;i<n;i++){
synchronized(lock){
//do sth
}
}
一种更加合理的做法应该是在外层只请求一次锁:
synchronized(lock){
for(int i=0;i<n;i++){
}
}
并行模式与算法
1、单例模式
2、不变模式
3、生产者-消费者模式
4、Future模式
Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。(JDK应用:Callable接口)
5、并行流水线
6、并行搜索
7、并行排序
8、并行算法:矩阵乘法
线程池相关
参数 | 含义 |
---|---|
corePoolSize | 线程池中的核心线程数 |
maximumPoolSize | 线程池中的最大线程数量 |
keepAliveTime | 多余的空闲线程的存活时间 |
unit | keepAliveTime单位 |
workQueue | 任务队列,被提交但是尚未被执行的任务 |
threadFactory | 线程工厂 |
handler | 拒绝策略 |
策略 | 含义 |
---|---|
AbortPolicy | 直接抛出异常,阻止系统正常工作 |
CallerRunsPolicy | 只要线程池未关闭,直接在调用者线程中,运行当前被丢弃的任务(性能急剧下降) |
DiscardOledestPolicy | 丢弃最老的一个请求 |
DiscardPolicy | 默默的丢弃无法处理的任务 |
定义:守护线程是一种特殊的线程,它是系统的守护者,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程就可以理解为守护线程。
接口Callable与Runnable区别
1)Callable接口的call()方法可以有返回值,而Runnable接口的run()方法没有返回值。
2)Callable接口的call()方法可以声明抛出异常,而Runnable接口的run()方法不可以声明抛出异常。
方法excute()与submit()的区别
1) 方法excute()没有返回值,而submit()方法可以有返回值。
2)方法excute()在默认的情况下异常直接抛出,不能捕获,但可以通过自定义Thread-Factory的方式进行捕获,而submit()方法在默认情况下,可以有catch Execution-Exception捕获异常。