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

  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/toov5/p/9856632.html
Copyright © 2011-2022 走看看