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

本文详细介绍了Java中的ReentrantLock和ReentrantReadWriteLock在并发编程中的使用,以及LockSupport方法的应用,同时结合实际面试题,为读者准备了一线大厂Java面试题库的全面解析和学习资源。
摘要由CSDN通过智能技术生成

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

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

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();

最后

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**

image
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
readOne = new Thread(() -> {

writeLock.lock();

try {

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

Thread.sleep(100000);

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

writeLock.unlock();

}

});

threadOne.start();

最后

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**

[外链图片转存中…(img-owq7pyz8-1714680615069)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值