标签:nbsp tip except print 静态 out trace 类型 star
锁机制是用来解决多线程共享资源时产生的冲突问题的。java 为每一个对象关联一个对象锁,通常把锁分为对象锁和类锁,他们的本质都是对象锁,只不过对象锁关联的是类的 Object 对象 (java.lang.Object),而类锁关联的是类的 Class 对象 java.lang.Class。
jvm 对每个锁都有一个计数
- 不管怎么分类,java 中通过 synchronized 来实现的锁其本质都是对象锁
- java 内部同步机制实现通常有两种方式,synchronized 修饰方法和语句块
- synchronized 关键字作用于对象,这个对象可以是类的实例对象,也可以是 Class 对象
1 public class SyncObject { 2 // 类锁1:通过static方法加同步锁 3 public static synchronized void syncMethod1() { 4 try { 5 System.out.println("testMethod1 start!"); 6 Thread.sleep(3000); 7 } catch (InterruptedException e) { 8 e.printStackTrace(); 9 } 10 System.out.println("testMethod1 end!"); 11 } 12 13 public void syncMethod2() { 14 // 类锁2:通过同步语句块传递Class类型参数 15 synchronized (SyncObject.class) { 16 try { 17 System.out.println("testMethod2 start!"); 18 Thread.sleep(3000); 19 } catch (InterruptedException e) { 20 e.printStackTrace(); 21 } finally { 22 System.out.println("testMethod2 end!"); 23 } 24 } 25 } 26 }
类锁作用于类的 Class 对象,对一个类来说,无论该类有多少个实例,它的静态变量和静态方法都只有一份,保存在 Class 对象中。通过对 Class 对象加锁来实现的同步语句或同步方法,无论该对象的哪个实例来访问,都需要竞争这个类锁
1 public class SyncObject { 2 // 对象锁1(方法锁):通过方法加同步锁 3 public synchronized void syncMethod1() { 4 try { 5 System.out.println("testMethod1 start!"); 6 Thread.sleep(3000); 7 } catch (InterruptedException e) { 8 e.printStackTrace(); 9 } 10 System.out.println("testMethod1 end!"); 11 } 12 13 public void syncMethod2() { 14 // 对象锁2:通过同步语句块传递Object类型参数 15 synchronized (this) { 16 // 此处的参数可以是本实例this,也可以是其它实例比如new SyncObject(),传入哪个实例就对哪个实例加锁 17 try { 18 System.out.println("testMethod2 start!"); 19 Thread.sleep(3000); 20 } catch (InterruptedException e) { 21 e.printStackTrace(); 22 } finally { 23 System.out.println("testMethod2 end!"); 24 } 25 } 26 } 27 }
对象锁会对类的实例对象加锁,每一个 new 操作都会获得一个新的实例对象,对于 synchronized 修饰的非 static 方法或传递参数为实例对象的语句块,各个实例对象会拥有自己的锁。
标签:nbsp tip except print 静态 out trace 类型 star
原文地址:http://www.cnblogs.com/ios9/p/7473165.html