}
}
复制代码
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) {
必看视频!获取2024年最新Java开发全套学习资料 备注Java
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();
Thread threadTwo = new Thread(() -> {
writeLock.lock();
try {
System.out.println(Thread.currentThread().getName() + “获取到线程”);
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
writeLock.unlock();
}
});
threadTwo.start();
Thread.sleep(100);
System.out.println(threadOne.getName() + “状态是:” + threadOne.getState());
System.out.println(threadTwo.getName() + “状态是:” + threadTwo.getState());
}
}
复制代码
4. 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.sleep(100);
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();
//此处睡眠是为了能获取waiting状态
Thread.sleep(100);
写在最后
很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。
最后祝愿各位身体健康,顺利拿到心仪的offer!
由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里
hread(() -> {
readLock.lock();
try {
System.out.println(Thread.currentThread().getName() + “获取到线程”);
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readLock.unlock();
}
});
threadTwo.start();
//此处睡眠是为了能获取waiting状态
Thread.sleep(100);
写在最后
很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。
最后祝愿各位身体健康,顺利拿到心仪的offer!
由于文章的篇幅有限,所以这次的蚂蚁金服和京东面试题答案整理在了PDF文档里
[外链图片转存中…(img-jJutoXCc-1716456417580)]
[外链图片转存中…(img-PwXioeKW-1716456417580)]
[外链图片转存中…(img-KOdjvAQb-1716456417580)]