public class DeadLockCase {
public static void main(String[] args){
Object o1 = new Object();
Object o2 = new Object();
new Thread(new SyncThread(o1, o2), "t1").start();
new Thread(new SyncThread(o2, o1), "t2").start();
}
static class SyncThread implements Runnable {
private Object lock1;
private Object lock2;
public SyncThread(Object o1, Object o2){
this.lock1 = o1;
this.lock2 = o2;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name + " acquiring lock on " + lock1);
synchronized (lock1) {
System.out.println(name + " acquired lock on " + lock1);
work();
System.out.println(name + " acquiring lock on " + lock2);
synchronized (lock2) {
System.out.println(name + " acquired lock on " + lock2);
work();
}
System.out.println(name + " released lock on " + lock2);
}
System.out.println(name + " released lock on " + lock1);
}
private void work() {
try {
//模拟死锁的关键,保证线程1只能获取一个锁,而线程2能获取到另一个锁
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
jps -l
:jstack
命令可以输出对应Java进程的线程快照信息:如何解决RabbitMQ重复消费的问题
spring有个注解@Async
能实现异步处理,有用过吗?Answer by new bing: 是的,@Async
注解可以让Spring中的方法异步执行。使用该注解后,Spring会将该方法放到一个线程池中执行,而不是在调用该方法的线程中执行。这样可以避免阻塞调用线程,提高系统的并发能力。
起一个线程耗多少内存,可以通过JVM的什么参数来控制吗? Answer by new bing: 可以使用-Xss
参数来设置每个线程的栈大小。默认情况下,每条线程的栈大小为1M。
Spring事务传播机制。我有一个业务类,它有两个方法,方法A是REQUIRED,方法B是REQUIRES_NEW,方法A调用方法B,外部调用方法A,会启动几个事务?Q:如果两个方法不在同一个类呢?
Redis List底层的数据结构是什么? 参考答案:
ziplist 是一个特殊的双向链表
特殊之处在于:没有维护双向指针:prev next;而是存储上一个 entry的长度和当前entry的长度,通过长度推算下一个元素在什么地方。
Redis如果采用AOF持久化方式,每隔5秒持久化一次,那它持久化时会影响其它读写线程吗?会不会阻塞主线程?参考答案5,6:AOF采用everysec时,Redis使用另一条线程每秒执行fsync同步硬盘。主线程在执行时候如果发现上一次的fsync操作还没有返回(对比上一次的fsync操作时间,大于2秒),主线程就会阻塞。 如图所示:
当系统硬盘资源繁忙时,会造成Redis主线程阻塞
简单来说,如果系统fsync缓慢,将会导致Redis主线程阻塞。
Q:Redis里存了几百个Key,遍历读取它们的值可能需要一两秒,有没有效率更高的方法?参考答案:
值得注意的是:
Q:使用redis pipeline有什么需要注意的?参考答案(主要参考new bing):在使用Redis Pipeline时,需要注意以下几点: