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();
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-ZPQAvkQz-1715726675517)]
[外链图片转存中…(img-33FSaIIn-1715726675517)]
[外链图片转存中…(img-cmXvEd7k-1715726675518)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!