zoukankan      html  css  js  c++  java
  • 线程--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无锁机制无限循环实现。

    • 排它锁
    • 分布式锁
  • 相关阅读:
    一个合格的程序员应该读过哪些书
    一个程序员如何快速赚到一百万?
    如何创造财富?硅谷创业之父 Paul Graham 《黑客与画家》思维导图
    java 入门书籍(java7)
    活动预售和预热的目的
    活动策划
    店铺费率把控
    如何通过店铺数据分析店铺异常原因?
    刷单三大目的?如何安全、低成本、高效完成刷单
    活动报名技巧之——天天特卖
  • 原文地址:https://www.cnblogs.com/xiaoaiying/p/13717907.html
Copyright © 2011-2022 走看看