java多线程编程3--对象及变量的并发访问

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> jps
6656 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.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值