有一个类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.每个线程都在运行。
一个线程来访问类insert()
的方法EmployeeInfo
。
同时:
insert()
方法 - 将会发生什么?update()
- 会发生什么?delete()
- 会发生什么?请按照上面的例子解释类级同步的概念。
答案 0 :(得分:3)
这里涉及两个单独的锁 - 一个用于实例,在其上调用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
}
}
答案 1 :(得分:0)
我不完全理解你的问题,但看起来好像你可能会这样问:
如果该类被一个线程锁定[其他线程可以访问]该类吗?
绝对! "锁"是一个欺骗性的词。当您使用synchronized
关键字来锁定对象(包括类对象)时,不会阻止其他线程访问或修改对象。
synchronized
唯一能做的就是阻止两个线程同时在同一个对象上同步。如果要防止两个或多个线程同时在同一数据上运行,那么您有责任确保可以访问数据的每个方法它在同一个对象上同步。
答案 2 :(得分:0)
类级别锁定可防止多个线程在运行时的任何可用实例中的synchronized块中输入。如EmployeeInfo类的insert方法的示例所示
我创建了EmployeeInfo类的对象。
EmployeeInfo e1 = new EmployeeInfo(); 线程A来访问e1。的插入()方法。
现在再次为EmployeeInfo类创建一个新对象 EmployeeInfo e2 = new EmployeeInfo(); 线程B来访问e2。的插入()方法。
现在再次为EmployeeInfo类创建一个新对象 EmployeeInfo e3 = new EmployeeInfo(); 线程C来访问e3的insert()方法。
目前,线程A具有EmployeeInfo对象的监视器 当我为EmployeeInfo对象e1,e2,e2创建不同的-2实例时,线程B和C都无法访问EmployeeInfo对象的insert()方法,因为这里的锁是在类级别上。 所以我的陈述给出了理解类级同步的完美示例。 “类级别锁定可防止多个线程在运行时的所有可用实例中的同步块中进入”。
尽管如此,如果我们使用对象级同步,那么锁只在一个实例上。对于每个对象e2,e3,e4都不是。所以锁定仅适用于被任何线程锁定的特定对象。