![](/img/trans.png)
[英]If I make class level lock on static method & if one thread execute it so will it block other thread executing other instance method of same class?
[英]what is the class level synchronization.If the class is locked by one thread at same other thread can access the other method of that class
有一个类EmployeeInfo它有一个静态同步方法非静态同步方法
public class EmployeeInfo{
public static synchronized void insert(){
//Insert code
}
public synchronized void update(){
//update code
}
public void delete(){
//update code
}
}
有五个线程A,B,C,D和E.每个线程都在运行。
一个线程来访问类EmployeeInfo
的方法insert()
。
与此同时:
insert()
方法 - 会发生什么? update()
- 会发生什么? delete()
- 会发生什么? 请按照上面的例子解释类级同步的概念。
这里涉及两个单独的锁 - 一个用于调用update
的实例 ,另一个用于类本身。 因此线程B将被阻塞,直到线程A完成,但其他两个线程将执行而不会阻塞。 (无论如何,D都没有同步。)
您的代码大致相当于:
public class EmployeeInfo{
public static void insert(){
synchronized (EmployeeInfo.class) {
// Insert code
}
}
public void update() {
synchronized (this) {
// Update code
}
}
public void delete() {
// Note: no synchronization
// Delete code
}
}
我不完全理解你的问题,但看起来好像你可能会这样问:
如果该类被一个线程锁定[其他线程可以访问]该类吗?
绝对! “锁定”是一个欺骗性的词。 当使用synchronized
关键字来锁定对象(包括一个类对象)它不会阻止其他线程访问或修改的对象。
synchronized
的唯一功能是它可以防止两个线程同时在同一个对象上同步。 如果要防止两个或多个线程同时对同一数据进行操作,那么您有责任确保每个可以访问数据的方法在同一个对象上同步。
类级锁定可防止多个线程在运行时的任何可用实例中的synchronized块中输入。如EmployeeInfo类的insert方法的示例
我创建了EmployeeInfo类的对象。
EmployeeInfo e1 = new EmployeeInfo(); 线程A来访问e1的insert()方法。
现在再次为类EmployeeInfo创建一个新对象EmployeeInfo e2 = new EmployeeInfo(); 线程B来访问e2的insert()方法。
现在再次为类EmployeeInfo创建一个新对象EmployeeInfo e3 = new EmployeeInfo(); 线程C来访问e3的insert()方法。
当前线程A具有EmployeeInfo对象的监视器线程B和C都不能访问EmployeeInfo对象的insert()方法,而我为EmployeeInfo对象e1,e2,e2创建了不同的-2实例,因为这里的锁是在类级别上。 所以我的陈述给出了理解类级同步的完美示例。 “类级锁定可防止多个线程在运行时的所有可用实例中的同步块中进入”。
尽管如此,如果我们使用对象级同步,那么锁只在一个实例上。对于每个对象e2,e3,e4都不是。所以锁定仅适用于被任何线程锁定的特定对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.