什么是java的互斥锁_互斥锁中的 锁释放是为了

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

代码如下, 我对unlock的理解是 如果不释放锁,那么别的线程即永远也得不到锁,相当于就运行不了,但是我发现把unlock() 方法注释掉也是可行的 只不过顺序会乱, 可线程还是继续运行,那释放锁的原理是什么呢 我看了api文档 可还是看不懂.

public static void main(String[] args) {

ReentrantLock lock= new ReentrantLock();

Condition condition1=lock.newCondition();

Condition condition2=lock.newCondition();

Condition condition3=lock.newCondition();

Runnable r1=new Runnable(){

public void run(){

int i=1;

while(i<10){

//调用lock方法 防止cpu随机选择线程的时候打乱顺序

lock.lock();

System.out.println("我是线程1.我是大佬,让我先来,你们都退下!!!!");

i++;

//当执行到这一步的时候唤醒 被con2锁住的线程

condition2.signalAll();

try {

//让自己出于等待状态

condition1.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

//不解锁的话

//lock.unlock();

}

}

};

Runnable r2=new Runnable() {

public void run() {

int i=1;

while(i<10){

lock.lock();

System.out.println("三弟,毕竟我是二哥,你就让我先来吧,你再等等.....");

i++;

condition3.signalAll();

try {

condition2.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

//lock.unlock();

}

}

};

Runnable r3=new Runnable() {

public void run() {

int i=0;

while(i<10){

lock.lock();

System.out.println("倚老卖老的两个家伙~~~~");

i++;

condition1.signalAll();

try {

condition3.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

//lock.unlock();

}

}

};

Thread t3= new Thread(r3);

Thread t2= new Thread(r2);

Thread t1= new Thread(r1);

t1.start();

t2.start();

t3.start();

}

这是没有注释掉 lock.unlock() 的结果

我是线程1.我是大佬,让我先来,你们都退下!!!!

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

倚老卖老的两个家伙~~~~

我是线程1.我是大佬,让我先来,你们都退下!!!!

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

倚老卖老的两个家伙~~~~

我是线程1.我是大佬,让我先来,你们都退下!!!!

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

倚老卖老的两个家伙~~~~

我是线程1.我是大佬,让我先来,你们都退下!!!!

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

倚老卖老的两个家伙~~~~

我是线程1.我是大佬,让我先来,你们都退下!!!!

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

倚老卖老的两个家伙~~~~

我是线程1.我是大佬,让我先来,你们都退下!!!!

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

倚老卖老的两个家伙~~~~

我是线程1.我是大佬,让我先来,你们都退下!!!!

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

倚老卖老的两个家伙~~~~

我是线程1.我是大佬,让我先来,你们都退下!!!!

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

倚老卖老的两个家伙~~~~

我是线程1.我是大佬,让我先来,你们都退下!!!!

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

倚老卖老的两个家伙~~~~

这是注释掉 lock.unlock() 的结果

我是线程1.我是大佬,让我先来,你们都退下!!!!

倚老卖老的两个家伙~~~~

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

我是线程1.我是大佬,让我先来,你们都退下!!!!

倚老卖老的两个家伙~~~~

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

我是线程1.我是大佬,让我先来,你们都退下!!!!

倚老卖老的两个家伙~~~~

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

我是线程1.我是大佬,让我先来,你们都退下!!!!

倚老卖老的两个家伙~~~~

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

我是线程1.我是大佬,让我先来,你们都退下!!!!

倚老卖老的两个家伙~~~~

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

我是线程1.我是大佬,让我先来,你们都退下!!!!

倚老卖老的两个家伙~~~~

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

我是线程1.我是大佬,让我先来,你们都退下!!!!

倚老卖老的两个家伙~~~~

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

我是线程1.我是大佬,让我先来,你们都退下!!!!

倚老卖老的两个家伙~~~~

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

我是线程1.我是大佬,让我先来,你们都退下!!!!

倚老卖老的两个家伙~~~~

三弟,毕竟我是二哥,你就让我先来吧,你再等等.....

我感觉差不多啊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java互斥锁是通过`ReentrantLock`类来实现的,它的实现原理是基于AQS(AbstractQueuedSynchronizer)同步器的。AQS是一个用于实现同步器的框架,它提供了两种同步状态,分别是独占模式和共享模式。 当一个线程请求时,如果没有被其他线程占用,则该线程成功获取并进入独占模式,此时其他线程再去请求时就会被阻塞。如果此时有其他线程已经占用了,则当前线程会被加入到一个等待队列,并且进入阻塞状态。 在`ReentrantLock`,还提供了可重入特性,也就是说同一个线程可以多次获取同一个,而不会被阻塞。这个特性是通过一个计数器来实现的,每当一个线程获取时,计数器加1,释放时计数器减1,这样同一个线程可以多次获取而不会阻塞。 `ReentrantLock`的实现原理主要包括以下几个步骤: 1. 初始化:初始化一个AQS同步器,同时初始化一个等待队列和一个线程对象; 2. 获取:如果未被占用,则当前线程获取并进入独占模式;如果已经被占用,则当前线程加入到等待队列,并且进入阻塞状态; 3. 释放:当前线程释放,并且计数器减1,同时唤醒等待队列的一个线程; 4. 可断获取:如果当前线程在等待的过程断,则会抛出`InterruptedException`异常。 总之,`ReentrantLock`是Java一种功能强大的互斥锁实现方式,它能够支持可重入特性、公平和非公平、可断获取等多种功能。在多线程编程,使用`ReentrantLock`可以有效地避免线程竞争和死等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值