并发,锁相关 博客分类: 总结-2014
多线程是java中一大块,伴随的多线程必然有临界区资源的竞争问题:
当多个线程同时访问临界区的时候,就会产生所谓的并发问题:
java中处理并发通常最常用的也是技术个人认为:
1: 不可变类, 2: synchronied同步字段 3: lock 4:ThreadLocal线程副本 5:并发容器 6: cas操作
7: Semaphore(1)二进制信号量
1: 不可变类,很简单就是设计线程安全的类,
2: synchronied同步字段
对方法: public synchronide void add(int l);
对对象: public void add(int i){
synchronized(this){
}
}
对类: publc void add(int i){
synchronized(Test.class){
}
}
synchronized对当前的线程是可以重入的:
关于cas操作: 就是比较和更新,然后接合非阻塞算法,
for(;;){
cas(exp, update);
}
juc中很多并发容器比如 队列等都是采用非阻塞算法实现的,
cas操作会产生一个ABA问题
// 笔记本坏了
如何设计高效的锁
1: 尽量减少锁的粒度,把计算时间长,io等放到外面
2:使用分坼锁和分离锁
分坼: 对不同的类型业务用不同的锁对象
分离: 类似ConcurrentHashMap 采用了16个锁,每个所锁住1/16
3:使用juc里的容器
4:使用cas,原子操作
5:活用ThreadLocal
6: 采用其他第三方的,memcached, redis等
下一篇: 业务到代码的抽象 博客分类: 服务端
推荐阅读
-
mysql负载,查询优化,索引和锁等 博客分类: 总结-2014
-
mysql负载,查询优化,索引和锁等 博客分类: 总结-2014
-
memcached和redis相关 博客分类: 总结-2014
-
并发,锁相关 博客分类: 总结-2014
-
重构,设计模式,封装 博客分类: 总结-2014
-
memcached和redis相关 博客分类: 总结-2014
-
guava笔记5-并发 博客分类: guavajava相关
-
DB2 和 Oracle 的并发控制(锁)比较 博客分类: database study DB2OracleIBM工作
-
并发控制锁表 博客分类: ORACLE 数据库 并发锁表控制
-
sql截取字符串和相关函数使用 博客分类: SQL开发总结 sql截取字符串函数