线程--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无锁机制无限循环实现。

  • 排它锁
  • 分布式锁
原文地址:https://www.cnblogs.com/xiaoaiying/p/13717907.html