java基础-线程状态分析-lock初步使用

public static void main(String[] args) {

Thread thread = new Thread(() -> {

while (num < 2) {

System.out.println(Thread.currentThread().getName() + “:park begin”);

LockSupport.park();

System.out.println(Thread.currentThread().getName() + “:park first”);

LockSupport.park();

System.out.println(Thread.currentThread().getName() + “:park second”);

}

});

thread.start();

// LockSupport.unpark(thread);

// System.out.println(thread.getName() + “:unpark first”);

num++;

}

}

复制代码

image.png

2. 2次park,1次unpark

public class LockPark {

private static int num = 0;

public static void main(String[] args) {

Thread thread = new Thread(() -> {

while (num < 2) {

System.out.println(Thread.currentThread().getName() + “:park begin”);

LockSupport.park();

System.out.println(Thread.currentThread().getName() + “:park first”);

LockSupport.park();

System.out.println(Thread.currentThread().getName() + “:park second”);

}

});

thread.start();

LockSupport.unpark(thread);

System.out.println(thread.getName() + “:unpark first”);

num++;

}

}

复制代码

image.png

3. 2次park,2次unpark

public class LockPark {

private static int num = 0;

public static void main(String[] args) throws InterruptedException {

Thread thread = new Thread(() -> {

while (num < 2) {

System.out.println(Thread.currentThread().getName() + “:park begin”);

LockSupport.park();

System.out.println(Thread.currentThread().getName() + “:park first”);

LockSupport.park();

System.out.println(Thread.currentThread().getName() + “:park second”);

}

});

thread.start();

LockSupport.unpark(thread);

System.out.println(thread.getName() + “:unpark first”);

num++;

//演示明显

Thread.sleep(100);

LockSupport.unpark(thread);

num++;

System.out.println(thread.getName() + “:unpark second”);

}

}

复制代码

image.png

由 1 2 3示例可知 unpark每次授权一个,park就会唤醒

4. 2次unpark,2次park,执行顺序颠倒,可证明unpark不累积

public class LockPark {

private static int num = 2;

public static void main(String[] args) throws InterruptedException {

Thread thread = new Thread(() -> {

while (true) {

if (num < 2) {

System.out.println(Thread.currentThread().getName() + “:park begin”);

LockSupport.park();

System.out.println(Thread.currentThread().getName() + “:park first”);

LockSupport.park();

System.out.println(Thread.currentThread().getName() + “:park second”);

}

}

});

thread.start();

LockSupport.unpark(thread);

System.out.println(thread.getName() + “:unpark first”);

LockSupport.unpark(thread);

System.out.println(thread.getName() + “:unpark second”);

num = 0;

while (true){

}

}

}

复制代码

image.png

5. 2次park,1次中断

public class LockPark {

private static int num = 0;

public static void main(String[] args) {

Thread thread = new Thread(() -> {

while (true) {

if (num < 2) {

System.out.println(Thread.currentThread().getName() + “:park begin”);

LockSupport.park();

System.out.println(Thread.currentThread().getName() + “:park first”);

LockSupport.park();

System.out.println(Thread.currentThread().getName() + “:park second”);

System.out.println(Thread.currentThread().getName() + “:interrupt first,状态是:”+Thread.currentThread().isInterrupted());

try {

sleep(1000000);

} catch (InterruptedException e) {

//抛出异常后,会将状态置位为false

}

System.out.println(Thread.currentThread().getName() + “:interrupt second,状态是:”+Thread.currentThread().isInterrupted());

//

LockSupport.park();

System.out.println(Thread.currentThread().getName() + “:park second”);

}

}

});

thread.start();

try {

sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

thread.interrupt();

while (true){

}

}

}

复制代码

image.png

一. Reentrantlock初步使用


LockSupport.park在AQS中使用,ReentrantLock会使用AQS,此文先分析ReentrantLock,AQS后面再分析,常用的两个锁有Reentrantlock(互斥锁)和ReentrantReadWriteLock(读共享,写互斥,读写互斥

1. Reentrantlock互斥

public class ReentrantlockOne {

public static void main(String[] args) throws InterruptedException {

ReentrantLock lock = new ReentrantLock();

Thread threadOne = new Thread(() -> {

lock.lock();

try {

System.out.println(Thread.currentThread().getName() + “获取到线程”);

Thread.sleep(100000);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

lock.unlock();

}

});

threadOne.start();

Thread threadTwo = new Thread(() -> {

lock.lock();

try {

System.out.println(Thread.currentThread().getName() + “获取到线程”);

Thread.sleep(100000);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

lock.unlock();

}

});

threadTwo.start();

Thread.sleep(100);

System.out.println(threadOne.getName()+ “状态是:” + threadOne.getState());

System.out.println(threadTwo.getName() + “状态是:” + threadTwo.getState());

}

}

复制代码

image.png

2. ReentrantReadWriteLock读共享

public class ReentrantReadWriteLockOne {

public static void main(String[] args) throws InterruptedException {

ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

ReentrantReadWriteLock.ReadLock readLock = lock.readLock();

ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();

Thread threadOne = new Thread(() -> {

readLock.lock();

try {

System.out.println(Thread.currentThread().getName() + “获取到线程”);

Thread.sleep(100000);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

readLock.unlock();

}

});

threadOne.start();

Thread threadTwo = new Thread(() -> {

readLock.lock();

try {

System.out.println(Thread.currentThread().getName() + “获取到线程”);

Thread.sleep(100000);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

readLock.unlock();

}

});

threadTwo.start();

Thread.sleep(100);

System.out.println(threadOne.getName() + “状态是:” + threadOne.getState());

System.out.println(threadTwo.getName() + “状态是:” + threadTwo.getState());

}

}

复制代码

image.png

3. ReentrantReadWriteLock写互斥

public class ReentrantReadWriteLockOne {

public static void main(String[] args) throws InterruptedException {

ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

ReentrantReadWriteLock.ReadLock readLock = lock.readLock();

ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();

Thread threadOne = new Thread(() -> {

writeLock.lock();

try {

System.out.println(Thread.currentThread().getName() + “获取到线程”);

Thread.sleep(100000);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

writeLock.unlock();

}

});

threadOne.start();

Thread threadTwo = new Thread(() -> {

writeLock.lock();

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-IqNHKgNc-1715726707802)]

[外链图片转存中…(img-WHl07PV7-1715726707802)]

[外链图片转存中…(img-vy119fRk-1715726707802)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值