《一线大厂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++;
}
}
复制代码
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++;
}
}
复制代码
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”);
}
}
复制代码
由 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){
}
}
}
复制代码
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){
}
}
}
复制代码
一. 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());
}
}
复制代码
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());
}
}
复制代码
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等等**
《一线大厂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面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!