有一个类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() --会发生什么?请按照上述示例解释类级同步的概念。
发布于 2014-09-29 05:57:29
这里涉及两个单独的锁-一个用于调用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
}
}发布于 2014-09-29 15:20:54
我不完全理解你的问题,但看起来你可能会问:
如果类被一个线程锁定,其他线程可以访问该类吗?
绝对一点儿没错!“锁”是个欺骗性的词。当您使用synchronized关键字锁定对象(包括类对象)时,它不会阻止其他线程访问或修改该对象。
synchronized所做的唯一的事情就是防止两个线程同时在同一个对象上同步。如果您希望防止两个或多个线程同时对同一数据进行操作,那么您有责任确保每个可以访问数据的方法在同一对象上同步。
发布于 2014-10-01 06:57:26
类级锁定防止多个线程在runtime.As上的任何可用实例中输入同步块(每个示例用于EmployeeInfo类的插入方法)
我创建了类EmployeeInfo的对象。
EmployeeInfo e1=new EmployeeInfo();线程A来访问e1的insert()方法。
现在,再次为类EmployeeInfo EmployeeInfo e2=new EmployeeInfo()创建一个新对象;Thread来访问e2的insert()方法。
现在,再次为类EmployeeInfo EmployeeInfo e3=new EmployeeInfo()创建了一个新对象;Thread C来了并访问e3的insert()方法。
当前,线程A具有EmployeeInfo对象的监视器,线程B和C都不能访问EmployeeInfo对象的insert()方法,而我为EmployeeInfo对象e1、e2、e2创建了不同的-2个实例,因为这里的锁在类级别上。因此,我的声明给出了一个理解类级同步的完美示例。“类级别锁定防止多个线程在运行时的任何可用实例中进入同步块”。
尽管如此,如果我们使用对象级的同步,那么对于每个对象( instance.not,e2,e3,e4),锁只对一个对象是锁。因此,锁将只针对被任何线程锁定的特定对象。
https://stackoverflow.com/questions/26093295
复制相似问题