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方法,具备可重入性

  • 相关阅读:
    umask
    mysql 错误总结 和FROM_UNIXTIME用法
    php 读取和下载execl
    Yii 2 load() 和 save()
    iframe 模拟ajax文件上传and formdata ajax 文件上传
    angular.js简单入门。
    mysql 慢日志
    mysql 基本操作 alter
    shell cut 用法
    微信支付与支付宝支付
  • 原文地址:https://www.cnblogs.com/toov5/p/9856632.html
Copyright © 2011-2022 走看看