JAVA ReentrantLock的使用

        public static void  main(String[] args){
            doSync();
        }

    private static void doSync() {

        MyThread myThread = new MyThread();

        new Thread(myThread).start();

        Thread tt = new Thread(myThread);
        tt.start();
        try {
            Thread.sleep(1000, 0);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("try interuppt ");

        tt.interrupt();

    }
class MyThread implements Runnable{
    private         ReentrantLock lock = new ReentrantLock();
    @Override
    public void run() {

        try {
            System.out.println("try to wait");
            lock.lockInterruptibly();
            Thread.sleep(5000);
            //       this.wait();
            System.out.println("after wait");
            lock.unlock();

        } catch (InterruptedException e) {
            System.out.println("recv interrupt");
        }

    }
}

输出:

try to wait
try to wait
try interuppt
recv interrupt
after wait
时间: 2024-10-14 18:04:25

JAVA ReentrantLock的使用的相关文章

java   ReentrantLock   分析

并发编程中经常用到的莫非是这个ReentrantLock这个类,线程获取锁和释放锁.还有一个则是synchronized,常用来多线程控制获取锁机制. 先写一个简单的例子. package com.multi.thread; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class AQSDemo { public static void main(S

java ReentrantLock可重入锁的使用场景

摘要 从使用场景的角度出发来介绍对ReentrantLock的使用,相对来说容易理解一些. 场景1:如果发现该操作已经在执行中则不再执行(有状态执行) a.用在定时任务时,如果任务执行时间可能超过下次计划执行时间,确保该有状态任务只有一个正在执行,忽略重复触发.b.用在界面交互时点击执行较长时间请求操作时,防止多次点击导致后台重复执行(忽略重复触发). 以上两种情况多用于进行非重要任务防止重复执行,(如:清除无用临时文件,检查某些资源的可用性,数据备份操作等) [java] view plain

Java ReEntrantLock 之 Condition条件(Java代码实战-002)

import java.util.LinkedList; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * ConditionTest * 一个测试类,用Condition实现的生产者消费者问题 */ public class ConditionTest { /* 定义

[图解Java]ReentrantLock重入锁

图解ReentrantLock 0. demo 我先给出一个demo, 这样大家就可以根据我给的这段代码, 边调试边看源码了. 还是那句话: 注意"My" , 我把ReentrantLock类 改名为了 "MyReentrantLock"类 , "Lock"类 改名为了"MyLock"类. 大家粘贴我的代码的时候, 把相应的"My"都去掉就好了, 否则会编译报错哦. import java.util.Sca

java ReentrantLock结合条件队列 实现生产者-消费者模式

1 package reentrantlock; 2 3 import java.util.ArrayList; 4 5 public class ProviderAndConsumerTest { 6 7 static ProviderAndConsumer providerAndConsumer = new ProviderAndConsumer(); 8 9 public static void main(String[] args) throws InterruptedException

java ReentrantLock 公平锁 非公平锁 测试

1 package reentrantlock; 2 3 import java.util.ArrayList; 4 import java.util.concurrent.locks.ReentrantLock; 5 6 public class TestFairSyn { 7 8 public static void main(String[] args) { 9 ArrayList<Thread> arrayList = new ArrayList<>(); 10 Resrc

java ReentrantLock小坑

ReentrantLock有个lockInterruptibly方法,该方法可被中断并抛异常,一般如果在finally里写unlock的话,在unlock时要加上判断isHeldByCurrentThread(),因为很可能unlock的线程不是lock的线程,会抛异常,进一步因为lockInterruptibly被中断时该线程并没有获得锁,然而finally里的unlock会执行,这时那个线程没有锁却要释放,会抛异常

Java中的锁

1 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁是指多个线程按照申请锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁.有可能,会造成优先级反转或者饥饿现象. 对于Java ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁.非公平锁的优点在于吞吐量比公平锁大. 对于Synchronized而言,也是一种非公平锁.由于其并不像ReentrantLock是通过AQS来实现线程调度,所以并有任何办法使其变成公平锁. 2

最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁

在Java并发场景中,会涉及到各种各样的锁如公平锁,乐观锁,悲观锁等等,这篇文章介绍各种锁的分类: 公平锁/非公平锁 可重入锁 独享锁/共享锁 乐观锁/悲观锁 分段锁 自旋锁 01.乐观锁 vs 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用. 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制. 乐观锁适用于多