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

    • 排它锁
    • 分布式锁
  • 相关阅读:
    Android Studio 2.2以上支持了Cmake的配置JNI的相关参数
    Unable to instantiate receiver xxx.receiver.NetworkReceiver异常
    关于imageview matrix
    Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)
    COOKIE和SESSION的区别
    Android NetworkInterface 的 name
    Android ROM资源文件存放位置
    selinux
    当WebView运行在特权进程时抛出安全异常,Hook方式解决方案(包含对Android 8.0的处理)
    Android判断当前是否在主线程
  • 原文地址:https://www.cnblogs.com/xiaoaiying/p/13717907.html
Copyright © 2020-2023  润新知