对象锁和类锁是否会互相影响?

转载 2017年04月24日 18:37:01

 . 对象锁和类锁是否会互相影响?

·        对象锁:Java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。线程进入synchronized方法的时候获取该对象的锁,当然如果已经有线程获取了这个对象的锁,那么当前线程会等待;synchronized方法正常返回或者抛异常而终止,JVM会自动释放对象锁。这里也体现了用synchronized来加锁的1个好处,方法抛异常的时候,锁仍然可以由JVM来自动释放。

·        类锁:对象锁是用来控制实例方法之间的同步,类锁是用来控制静态方法(或静态变量互斥体)之间的同步。其实类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的。我们都知道,java类可能会有很多个对象,但是只有1Class对象,也就是说类的不同实例之间共享该类的Class对象。Class对象其实也仅仅是1java对象,只不过有点特殊而已。由于每个java对象都有1个互斥锁,而类的静态方法是需要Class对象。所以所谓的类锁,不过是Class对象的锁而已。获取类的Class对象有好几种,最简单的就是MyClass.class的方式。

·        类锁和对象锁不是同1个东西,一个是类的Class对象的锁,一个是类的实例的锁。也就是说:1个线程访问静态synchronized的时候,允许另一个线程访问对象的实例synchronized方法。反过来也是成立的,因为他们需要的锁是不同的。


类锁,对象锁,私有锁

1. 类锁:在代码中的方法上加了static和synchronized的锁,或者synchronized(xxx.class)的代码段

2.对象锁:在代码中的方法上加了synchronized的锁,或者synchronized(this)的代码段

3.私有锁:在类内部声明一个私有属性如private Object lock,在需要加锁的代码段synchronized(lock)

 

对象锁:假设我有一个类ClassA,其中有一个方法synchronized methodA(),那么当这个方法被调用的时候你获得就是对象锁。

举例:ClassA a = new ClassA(); ClassA b = new ClassA(); 那么如果你在a这对象上调用了methodA,不会影响b这个对象,也就是说对于b这个对象,他也可以调用methodA,因为这是两对象,所以说对象锁是针对对象的

 

类锁,其实没有所谓的类锁,因为类锁实际上就是这个类的对象的对象锁

举例:我有一个类ClassA,其中有一个方法synchronized static methodA(),注意这个方法是静态的了,那就是说这个类的所有的对象都公用一个这个方法了,那如果你在这个类的某个对象上调用了这个方法,那么其他的对象如果想要用这个方法就得等着锁被释放,所以感觉就好像这个类被锁住了一样。


Java对象锁和类锁全面解析(多线程synchronized关键字)

最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念。最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没...
  • u013142781
  • u013142781
  • 2016-06-17 15:51:28
  • 18815

透彻理解 Java synchronized 对象锁和类锁的区别

synchronized 加到 static 方法前面是给class 加锁,即类锁;而synchronized 加到非静态方法前面是给对象上锁。这两者的区别我用代码来演示下: 对象锁和类锁是不同的锁,...
  • zhujiangtaotaise
  • zhujiangtaotaise
  • 2017-02-17 14:34:05
  • 5806

JAVA对象锁与类锁

1、被syncronized修饰的方法,是对类的对象加锁,也就是说,当对象访问该方法时,当前的对象会被加锁,同一时刻同一对象不能再访问该方法,或者该对象的其他被syncronized修饰的方法。不同对...
  • guguituzi
  • guguituzi
  • 2014-11-17 22:18:49
  • 1281

对象锁和类锁是否会互相影响

一. 对象锁和类锁是否会互相影响?·        对象锁:Java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。线程进入synchronized方法的时候获取该对象的锁,当然如果已经有线...
  • u011402896
  • u011402896
  • 2018-02-24 16:30:09
  • 72

类锁和对象锁

对象锁 当一个对象中有synchronized method或synchronized block的时候调用此对象的同步方法或进入其同步区域时,就必须先获得对象锁。如果此对象的对象锁已被其他调用者占用...
  • wisgood
  • wisgood
  • 2013-11-17 21:53:56
  • 1166

方法锁、对象锁和类锁区别

引言:结合synchronized进行分析。 synchronized用来处理多个线程同时访问同一个类的一个代码块、方法,甚至这个类。 (1)修饰代码块时,需要一个reference对象作为锁...
  • qq_35181209
  • qq_35181209
  • 2017-05-22 16:15:09
  • 809

类锁 synchronized对象锁 和 Lock对象锁

在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。1. 对象锁所有对象都自动含有单一的锁。JVM负责跟踪对象被加锁的次数。如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁的时候...
  • qq_33530388
  • qq_33530388
  • 2017-03-18 18:45:49
  • 1639

共享锁与排它锁

共享锁【S锁】 又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前...
  • p10010
  • p10010
  • 2015-12-13 15:11:15
  • 1964

JAVA并发编程(二)内置锁和对象共享

Java提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block)。内置锁的最小颗粒度是对象,修饰方法上的锁也是作用于对象。有时候叫它方法锁,但是实际上是锁住的对象。 内置...
  • robertcpp
  • robertcpp
  • 2016-07-06 22:18:26
  • 2972

方法锁,对象锁,类锁区别

原文链接 首先的明白Java中锁的机制synchronized 在修饰代码块的时候需要一个reference对象作为锁的对象. 在修饰方法的时候默认是当前对象作为锁的对象. 在修饰类时候...
  • crazylzxlzx
  • crazylzxlzx
  • 2016-08-13 18:31:33
  • 15510
收藏助手
不良信息举报
您举报文章:对象锁和类锁是否会互相影响?
举报原因:
原因补充:

(最多只允许输入30个字)