首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类级synchronization.If是什么?类被一个线程锁定在同一个线程上,另一个线程可以访问该类的另一个方法。

类级synchronization.If是什么?类被一个线程锁定在同一个线程上,另一个线程可以访问该类的另一个方法。
EN

Stack Overflow用户
提问于 2014-09-29 05:53:03
回答 3查看 84关注 0票数 1

有一个类EmployeeInfo,它有一个静态同步方法,非静态同步方法。

代码语言:javascript
复制
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

同时:

  • 现在,B线程来尝试再次访问insert()方法--会发生什么?
  • 现在C线程来尝试访问update() --会发生什么?
  • 现在,D线程来尝试访问delete() --会发生什么?

请按照上述示例解释类级同步的概念。

EN

回答 3

Stack Overflow用户

发布于 2014-09-29 05:57:29

这里涉及两个单独的锁-一个用于调用update的实例,另一个用于类本身。因此,线程B将被阻塞,直到线程A完成为止,但其他两个线程将在不阻塞的情况下执行。(无论如何,D在任何事情上都没有同步。)

您的代码大致相当于:

代码语言:javascript
复制
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
    }
}
票数 3
EN

Stack Overflow用户

发布于 2014-09-29 15:20:54

我不完全理解你的问题,但看起来你可能会问:

如果类被一个线程锁定,其他线程可以访问该类吗?

绝对一点儿没错!“锁”是个欺骗性的词。当您使用synchronized关键字锁定对象(包括类对象)时,它不会阻止其他线程访问或修改该对象。

synchronized所做的唯一的事情就是防止两个线程同时在同一个对象上同步。如果您希望防止两个或多个线程同时对同一数据进行操作,那么您有责任确保每个可以访问数据的方法在同一对象上同步。

票数 0
EN

Stack Overflow用户

发布于 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),锁只对一个对象是锁。因此,锁将只针对被任何线程锁定的特定对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26093295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档