如何找问题
1 明确哪些代码是多线程运行代码
2 明确共享数据
3 明确多线程运行代码中哪些语句操作共享数据
同步函数用的哪一个锁?
函数需要被对象调用,那么函数都有一个所属对象的引用,就是this
所以同步函数使用的锁是this
如果同步函数被静态修饰后,使用的锁是什么呢?
通过验证,不是this,因为静态方法中也不可以定义this
静态进内存时,内存没本类对象,但是一定有该类对应的字节码文件对象
静态同步方法,使用的锁是该方法所在类的字节码文件对象,类名.class
类名.class
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
死锁
同步中嵌套同步,锁却不同
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
Happy coder