1.数据类型String的常量池特性
在jvm中具有String常量池缓存的功能,例如:
String str1 = "a";
String str2 = "a";
if(str1 == str2){
...
}//返回true
因此同步synchronized代码块都不要使用String作为锁对象,而改用其它,例如new object()实例化一个object对象,但它并不放入缓存中。
多线程的死锁检测
进入jdk安装目录的bin目录下,运行jps
得到线程的id号(例如3301),然后利用jstack命令
jstack -l 3301查看是否有死锁出现。
示例代码:
public class Run {
public static void main(String[] args) {
// 实例2个线程类
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
// 开启2个线程
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
}
}
class TestDeadLock implements Runnable {
public int flag = 0;
static Object o1 = new Object(),o2 = new Object();
public void run(){
System.out.println("flag=" + flag + " time: " + System.currentTimeMillis());
if (flag == 1) {
synchronized (o1) {
System.out.println(Thread.currentThread().getName() + "锁住lock1 time: " + System.currentTimeMillis());
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "锁住lock2 time: " + System.currentTimeMillis());
System.out.println(Thread.currentThread().getName() + "释放lock2 time: " + System.currentTimeMillis());
}
System.out.println(Thread.currentThread().getName() + "释放lock1 time: " + System.currentTimeMillis());
}
}
if (flag == 0) {
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "锁住lock2 time: " + System.currentTimeMillis());
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println(Thread.currentThread().getName() + "锁住lock1 time: " + System.currentTimeMillis());
System.out.println("0");
System.out.println(Thread.currentThread().getName() + "释放lock1 time: " + System.currentTimeMillis());
}
System.out.println(Thread.currentThread().getName() + "释放lock2 time: " + System.currentTimeMillis());
}
}
}
}
运行输出:
flag=1 time: 1475586969319
Thread-0锁住lock1 time: 1475586969319
flag=0 time: 1475586969418
Thread-1锁住lock2 time: 1475586969418
发生死锁,thread-0和thread-1互相锁住对方等待资源
C:\Program Files\Java\jdk1.8.0_101\bin> jps6656 Jps
8200 Run
C:\Program Files\Java\jdk1.8.0_101\bin> jstack 8200
2016-10-04 21:21:33
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode):
"DestroyJavaVM" prio=6 tid=0x00000000024bf800 nid=0xbec waiting on condition [0
0000000000000000]
java.lang.Thread.State: RUNNABLE
"Thread-1" prio=6 tid=0x000000000c42f000 nid=0x233c waiting for monitor entry [
x000000000c7ff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.yf.controller.TestDeadLock.run(Run.java:59)
- waiting to lock <0x00000007d6da6980> (a java.lang.Object)
- locked <0x00000007d6da6990> (a java.lang.Object)
at java.lang.Thread.run(Unknown Source)
"Thread-0" prio=6 tid=0x000000000c3b6000 nid=0x165c waiting for monitor entry [
x000000000cb1e000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.yf.controller.TestDeadLock.run(Run.java:43)
- waiting to lock <0x00000007d6da6990> (a java.lang.Object)
- locked <0x00000007d6da6980> (a java.lang.Object)
at java.lang.Thread.run(Unknown Source)
"Service Thread" daemon prio=6 tid=0x000000000a878000 nid=0x1d5c runnable [0x00
0000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" daemon prio=10 tid=0x000000000a876000 nid=0x2170 waiting o
condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" daemon prio=10 tid=0x000000000a874800 nid=0x1708 waiting o
condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Attach Listener" daemon prio=10 tid=0x000000000a874000 nid=0x183c waiting on c
ndition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0x000000000a872800 nid=0x1e38 runnable [
x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=8 tid=0x000000000a803800 nid=0x1aa4 in Object.wait() [0
000000000bdef000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007d6c85568> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
- locked <0x00000007d6c85568> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
"Reference Handler" daemon prio=10 tid=0x000000000a7fc800 nid=0x1218 in Object.
ait() [0x000000000bc8e000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007d6c850f0> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
- locked <0x00000007d6c850f0> (a java.lang.ref.Reference$Lock)
"VM Thread" prio=10 tid=0x000000000a7f9000 nid=0x1e9c runnable
"GC task thread#0 (ParallelGC)" prio=6 tid=0x000000000233e000 nid=0x62c runnabl
"GC task thread#1 (ParallelGC)" prio=6 tid=0x0000000002340000 nid=0x964 runnabl
"GC task thread#2 (ParallelGC)" prio=6 tid=0x0000000002341800 nid=0x6f0 runnabl
"GC task thread#3 (ParallelGC)" prio=6 tid=0x0000000002343000 nid=0x1dc4 runnab
e
"VM Periodic Task Thread" prio=10 tid=0x000000000c2e0800 nid=0x1838 waiting on
ondition
JNI global references: 109
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x000000000a803368 (object 0x00000007d6da6980, a java
lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x000000000a801ec8 (object 0x00000007d6da6990, a java
lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at com.yf.controller.TestDeadLock.run(Run.java:59)
- waiting to lock <0x00000007d6da6980> (a java.lang.Object)
- locked <0x00000007d6da6990> (a java.lang.Object)
at java.lang.Thread.run(Unknown Source)
"Thread-0":
at com.yf.controller.TestDeadLock.run(Run.java:43)
- waiting to lock <0x00000007d6da6990> (a java.lang.Object)
- locked <0x00000007d6da6980> (a java.lang.Object)
at java.lang.Thread.run(Unknown Source)
Found 1 deadlock.