多线程是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等