[英]Difference between class locking and object locking in Java
人们讲述了两种类型的多线程锁定 - 对象和类。 据我所知,锁定仅在对象上完成。
案例1:使用new
方法或工厂方法等创建的对象 。
void synchronized myMethod(Type param) {
//will lock on the instance used to call this method
}
要么
synchronized(this) {
//will lock on current object
}
要么
synchronized(obj1) {
//will lock on specified obj1 object
}
案例2:关于java.lang.Class
对象
这称为类锁,可以与静态字段或方法或块一起使用,因为它们属于类并在所有对象和其他类属性之间共享。
static void synchronized method() {
//will lock the Class object
}
要么
static {
synchronized(SomeClass.class){
int a = 2;
}
}
java.lang.Class
对象中 。 因此抽象,它的对象锁定和图片中,我们看到类锁定。 java.lang.Class
实例)也以相同的方式工作。 我想知道在同步静态方法的情况下,在以下两种情况下锁定线程获取哪个类:
到目前为止,这是我对这个问题的理解。 请加上或纠正。
人们讲述了两种类型的多线程锁定 - 对象和类。
类是一个对象。 Java 语言中只有一种锁定:每个对象(包括每个类)都有一个可以通过synchronized
块或synchronized
方法锁定的互斥锁。 要锁定的Object隐含在synchronized
方法中:它是实例方法的“this”实例,它是静态方法的Class对象。
最常见的新手错误之一是认为两个不同的线程无法同时进入同一个synchronized
块。 他们可以 ,并且StackOverflow中有很多问题和答案可以证明这一点。 另一个错误是认为如果一个线程在某个对象上同步,那么其他线程将无法修改该对象。 他们可以和他们一样。
同步可防止两个或多个线程同时在同一个Object上进行同步。 哪个对象是正确的对象? 这一切都与保护您的数据有关。 例如,如果要保护的结构是链接列表,则可以选择访问列表以在列表标题上进行同步的任何方法。 如果要保护全局数据(例如, static
变量),则需要在全局对象上进行同步(例如,拥有变量的Class对象。)重要的是,如果您有读/写数据(又名) ,“可变数据”),由多个线程访问,然后访问相同数据的每个方法必须在同一个锁上同步。
Java中有另一种锁定,但它不是Java 语言 ; 它在Java标准库中。 它可以通过实现java.util.concurrent.locks.Lock接口的对象获得。 当然,一个锁定对象(像任何对象)也实现了第一类锁定的,但你应该永远, 永远 ,一个锁对象上,除非你想给人们的印象是,你是一个无能的新手同步。
java.util.concurrent样式的锁定比使用synchronized
块更强大,因为它是显式的lock()和unlock()方法。 例如,一种方法可以锁定锁,而另一种方法可以解锁。 这可能导致代码难以理解,除非我有充分的理由,否则我不会这样做,但有时候有充分的理由。
唯一的区别是类实例上的static synchronized
锁和非静态synchronized
方法锁定实例。
人们讲述了两种类型的多线程锁定
有对象实例锁和Lock
样式锁。 一个令人困惑的Lock
,两者都有。
对象和类
不正确,因为你已经解决了。
仅仅因为人们说东西不能成真。 人们经常说很多废话。 事实上,整个网站致力于无意义的Java。 :P
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.