zoukankan      html  css  js  c++  java
  • Java锁机制-重入锁

    锁的种类:

    读写锁   悲观锁  乐观锁 CSA无锁  自旋锁  AQS 非公平锁 公平锁 互斥锁 排它锁  分布式锁(redis实现 和 zk实现)

    轻量级锁(lock),重量级锁(synchronize)

     

    重入锁

    锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利。

    重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。

    锁的特征是可以传递的,锁是可以传递的,是方法递归进行传递 。是为了避免死锁问题的

    在JAVA环境下 ReentrantLock(显式锁、轻量级锁)和Synchronized (内置锁、重量级锁)都是 可重入锁

     废话不多说,ReentrantLock(显式锁、轻量级锁):

    package SuoTest;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class ChongruTest extends Thread {
       
        Lock lock =new ReentrantLock();
        
          @Override
        public void run() {
            set(); 
            
        }
        
       public  void  set(){
           try {
               lock.lock();
               System.out.println("set方法");
               get();
        } catch (Exception e) {
            // TODO: handle exception
        }finally {
            lock.unlock();
        }
          
       }
       public  void get(){
           System.out.println("lock 可以具备可重入性-get方法");
           try {
            lock.lock();
        } catch (Exception e) {
            // TODO: handle exception
        }finally {
            lock.unlock();
        }
       }
          
        public static void main(String[] args) {
            ChongruTest chongruTest =  new ChongruTest();
            chongruTest.start();
        }
    }
    
    

    运行结果:

    Synchronized (内置锁、重量级锁):

     正常情况下释放锁的条件是 异常或者代码运行完毕  

    package SuoTest;
    
    public class SynchronizeTest implements Runnable{
        public void run() {
            set();
        }
        public synchronized void set(){
            System.out.println("set方法");
            get();
        }
        public synchronized void get(){
            System.out.println("get方法");
        }
        
        public static void main(String[] args) {
            SynchronizeTest synchronizeTest = new SynchronizeTest();
            Thread t1 =  new Thread(synchronizeTest);
            t1.start();
            
        }
        
    } 

    set方法把锁传递给了get方法,具备可重入性

  • 相关阅读:
    tr命令修剪换行符
    K8S从secret文件生成密钥后,如何更新Kubernetes上的密钥呢?
    tcpdump
    wireshark怎么抓包、wireshark抓包详细图文教程
    Kubernetes v1.15.3 升级到 v1.18.5 心得
    Python 简明教程 --- 20,Python 类中的属性与方法
    php大文件(视频)上传解决方案
    求大文件(视频)上传解决方案
    wordpress粘贴word图片且图片文件自动上传功能
    CMS粘贴word图片且图片文件自动上传功能
  • 原文地址:https://www.cnblogs.com/toov5/p/9856632.html
Copyright © 2011-2022 走看看