线程--4(锁)
java锁机制
- 悲观锁
默认包含排它锁,每次拿数据的时候,都会上锁 缺点:效率低,因为只能保证一个连接进行操作。
- 乐观锁
版本标识--即cas无锁机制
- 重入锁
重入锁(锁可以传递给下一个方法)与非重入锁(会产生死锁)
- 读 写锁
可以共读,不可共写。读写锁最好一起使用
package com.xiaoai.thread;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 读写锁
*/
public class Cache {
private static volatile Map<String,Object> map = new HashMap<>();
//读写锁
static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
//读锁
static Lock r = rwl.readLock();
//写锁
static Lock w = rwl.writeLock();
//写方法
static public void put(String key,Object value){
try {
w.lock();//写锁住
System.out.println("正在写入:key="+key+"--value="+value+",开始。。。");
Thread.sleep(100);
map.put(key,value);
System.out.println("正在写入:key="+key+"--value="+value+",结束。。。");
System.out.println();
}catch (Exception e){
e.printStackTrace();
}finally {
w.unlock();//写解锁
}
}
//读方法
static public Object get(String key){
Object value = null;
try {
r.lock();//读锁住
System.out.println("正在读取:key="+key+",开始。。。");
Thread.sleep(100);
value = map.get(key);
System.out.println("正在读取:key="+key+"--value="+value+",结束。。。");
System.out.println();
return value;
}catch (Exception e){
e.printStackTrace();
}finally {
r.unlock();//读解锁
}
return value;
}
public static void main(String[] args){
//写线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++){
put(i+"",i);
}
}
}).start();
//读线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++){
get(i+"");
}
}
}).start();
}
}
- CAS无锁
cas无锁机制效率比有锁机制高,cas无锁机制其实和乐观锁类似概念。
cas三个参数:1-V表示要更新的变量 2-E表示预期值 3-N表示新值
仅当v值=e值是,才会将v值设为n,如v值和e值不同,说明已经有其他线程做了更新,则当前线程说明都不做。最后,cas返回当前v的真实值
- 自旋锁
底层通过cas无锁机制无限循环实现。
- 排它锁
- 分布式锁