零EVA

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何找问题

  1 明确哪些代码是多线程运行代码

  2 明确共享数据

  3 明确多线程运行代码中哪些语句操作共享数据

同步函数用的哪一个锁?

函数需要被对象调用,那么函数都有一个所属对象的引用,就是this

所以同步函数使用的锁是this

 

如果同步函数被静态修饰后,使用的锁是什么呢?

通过验证,不是this,因为静态方法中也不可以定义this

静态进内存时,内存没本类对象,但是一定有该类对应的字节码文件对象

静态同步方法,使用的锁是该方法所在类的字节码文件对象,类名.class

类名.class

 1 class Bank
 2 {
 3     private int sum;
 4     Object obj = new Object();
 5     public synchronized void add(int n)
 6     {
 7         //synchronized(obj)
 8         //{
 9             sum += n;
10             try{Thread.sleep(10);}catch(Exception e){}
11             System.out.println("sum="+sum);
12         //}
13     }
14 }
15 
16 class Cus implements Runnable
17 {
18     private Bank b = new Bank();
19     public void run()
20     {
21         for(int x = 0; x < 3;x++)
22         {
23             b.add(100);
24         }
25     }
26 }
27 
28 class BankDemo
29 {
30     public static void main(String[] args)
31     {
32         Cus c = new Cus();
33         Thread t1 = new Thread(c);
34         Thread t2 = new Thread(c);
35         t1.start();
36         t2.start();
37     }
38 }
View Code

 死锁

  同步中嵌套同步,锁却不同

 1 class Test implements Runnable
 2 {
 3     private boolean flag;
 4     Test(boolean flag)
 5     {
 6         this.flag = flag;
 7     }
 8     
 9     public void run()
10     {
11         if(flag)
12         {
13             synchronized(MyLock.locka)
14             {
15                 System.out.println("if locka");
16                 synchronized(MyLock.lockb)
17                 {
18                     System.out.println("if lockb");
19                 }
20             }
21         }
22         else
23         {
24             synchronized(MyLock.lockb)
25             {
26                 System.out.println("else lockb");
27                 synchronized(MyLock.locka)
28                 {
29                     System.out.println("else locka");
30                 }
31             }
32         }
33     }
34 }
35 
36 class MyLock
37 {
38     static Object locka = new Object();
39     static Object lockb = new Object();
40 }
41 
42 class DeadLockTest
43 {
44     public static void main(String[] args)
45     {
46         Thread t1 = new Thread(new Test(true));
47         Thread t2 = new Thread(new Test(false));
48         t1.start();
49         t2.start();
50     }
51 }
View Code

 

posted on 2017-06-20 17:52  零EVA  阅读(150)  评论(0编辑  收藏  举报