zoukankan      html  css  js  c++  java
  • 多线程相关ReentrantLock

    reentrantlock  必须要必须要必须要手动释放锁
    使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放
    使用reentrantlock可以进行“尝试锁定”tryLock,这样无法锁定,或者在指定时间内无法锁定,线程可以决定是否继续等待,例如代码
     1 /**
     2      * 使用tryLock进行尝试锁定,不管锁定与否,方法都将继续执行
     3      * 可以根据tryLock的返回值来判定是否锁定
     4      * 也可以指定tryLock的时间,由于tryLock(time)抛出异常,所以要注意unclock的处理,必须放到finally中
     5      */
     6     void m2() {
     7         /*
     8         boolean locked = lock.tryLock();
     9         System.out.println("m2 ..." + locked);
    10         if(locked) lock.unlock();
    11         */
    12         
    13         boolean locked = false;
    14         
    15         try {
    16             locked = lock.tryLock(5, TimeUnit.SECONDS);
    17             System.out.println("m2 ..." + locked);
    18         } catch (InterruptedException e) {
    19             e.printStackTrace();
    20         } finally {
    21             if(locked) lock.unlock();
    22         }
    23         
    24     }
    使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应,在一个线程等待锁的过程中,可以被打断
     1 /**
     2  * reentrantlock用于替代synchronized
     3  * 由于m1锁定this,只有m1执行完毕的时候,m2才能执行
     4  * 这里是复习synchronized最原始的语义
     5  * 
     6  * 使用reentrantlock可以完成同样的功能
     7  * 需要注意的是,必须要必须要必须要手动释放锁(重要的事情说三遍)
     8  * 使用syn锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放
     9  * 
    10  * 使用reentrantlock可以进行“尝试锁定”tryLock,这样无法锁定,或者在指定时间内无法锁定,线程可以决定是否继续等待
    11  * 
    12  * 使用ReentrantLock还可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应,
    13  * 在一个线程等待锁的过程中,可以被打断
    14  * 
    15  * @author mashibing
    16  */
    17 package com.hamster.concurrent.c020;
    18 
    19 import java.util.concurrent.TimeUnit;
    20 import java.util.concurrent.locks.Lock;
    21 import java.util.concurrent.locks.ReentrantLock;
    22 
    23 public class ReentrantLock4 {
    24         
    25     public static void main(String[] args) {
    26         Lock lock = new ReentrantLock();
    27         
    28         
    29         Thread t1 = new Thread(()->{
    30             try {
    31                 lock.lock();
    32                 System.out.println("t1 start");
    33                 TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
    34                 System.out.println("t1 end");
    35             } catch (InterruptedException e) {
    36                 System.out.println("interrupted!");
    37             } finally {
    38                 lock.unlock();
    39             }
    40         });
    41         t1.start();
    42         
    43         Thread t2 = new Thread(()->{
    44             try {
    45                 //lock.lock();
    46                 lock.lockInterruptibly(); //可以对interrupt()方法做出响应
    47                 System.out.println("t2 start");
    48                 TimeUnit.SECONDS.sleep(5);
    49                 System.out.println("t2 end");
    50             } catch (InterruptedException e) {
    51                 System.out.println("interrupted!");
    52             } finally {
    53                 lock.unlock();
    54             }
    55         });
    56         t2.start();
    57         
    58         try {
    59             TimeUnit.SECONDS.sleep(1);
    60         } catch (InterruptedException e) {
    61             e.printStackTrace();
    62         }
    63         t2.interrupt(); //打断线程2的等待
    64         //ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获取锁,而会抛出一个InterruptedException
    65     }
    66 }
  • 相关阅读:
    python3 TypeError: a bytes-like object is required, not 'str'
    Centos 安装Python Scrapy PhantomJS
    Linux alias
    Vim vimrc配置
    Windows下 Python Selenium PhantomJS 抓取网页并截图
    Linux sort
    Linux RSync 搭建
    SSH隧道 访问内网机
    笔记《鸟哥的Linux私房菜》7 Linux档案与目录管理
    Tornado 错误 "Global name 'memoryview' is not defined"
  • 原文地址:https://www.cnblogs.com/zchok/p/12972243.html
Copyright © 2011-2022 走看看