当前位置: 首页 > 知识库问答 >
问题:

在类非静态属性上应用同步

夹谷苗宣
2023-03-14

public class main class { public static void main(String[]args){

    T1 ok = new T1();
    T2 ok1 = new T2();
    ok.start();
    ok1.start();
}

}

public class T1 extends Thread {

@Override
public void run() {
    DemoClass q = new DemoClass();
    for (int i = 0; i <= 5; i++)
        try {
            q.demoMethod();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

}

public class T2 extends Thread {

@Override
public void run() {
    DemoClass q = new DemoClass();
    for (int i = 0; i <= 5; i++)
        try {
            q.demoMethod1();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

}

public class DemoClass {
String s = "";
String s1 = "";
public void demoMethod() throws InterruptedException {
    System.out.println(Thread.currentThread().getName() + " Entered m1");

    synchronized (s) {
        System.out.println(Thread.currentThread().getName() + " Inside m1 ");

        Thread.sleep(5000);
    }
    System.out.println(Thread.currentThread().getName()+" m1");

}

public void demoMethod1() throws InterruptedException {
    System.out.println(Thread.currentThread().getName() + " Entered m2");


        System.out.println(Thread.currentThread().getName() + " Inside m2 ");

        Thread.sleep(5000);
    
    System.out.println(Thread.currentThread().getName()+" m2");

}

}

即使我创建了DemoClass的单独对象,然后通过单独的线程调用单独的方法。为什么一次只有一个线程工作?

或者,如果有人可以建议我们将调用 DemoClass 中的代码的锁定类型

共有1个答案

戈睿识
2023-03-14

您正在< code>s上同步,它始终是同一个对象。

不要那样做。如果要同步任何内容,请在< code>this上同步。

 类似资料:
  • 我在看一个项目,我发现了一些很奇怪的东西。 现在,我认为唯一的两个优点是,在非静态容器中封装时,命名更加清晰,并且可以传递的参数更少。 但我想知道这是不是一个好主意,通过设计来包装静态类与非静态?如果有的话,还有哪些其他原因?因为我认为创建一个静态并对其进行调用是可以的。但是这个项目特意将所有静态类打包;我也不知道为什么。

  • 模型静态属性 [ ] model 定义一个模型 'use strict'; module.exports = app => { const { STRING, INTEGER, DATE } = app.Sequelize; const Post = app.model.define('post', { id: { type: INTEGER, prima

  • 问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 为什么我会得到“无法从静态上下文引用的非静态变量”? 这是代码 错误说: 非静态类 Node 不能从静态上下文中引用 为什么不应该在main()方法中引用Node类? 问题答案: Java中的非静态嵌套类包含对父类 实例 的隐式引用。因此,要实例化a ,您还需要具有一个实例。在静态上下文(主要方法)中,没有要引用的实例。因此,编

  • 我最近对 PHP 5.4 进行了更新,但收到有关静态和非静态代码的错误。 这是错误: 这是第371行: 我希望有人能帮忙。

  • 我正在努力得到一个用户的基础上,他的id或电子邮件后,他登录通过一个表单。这个函数是在user.class.php中定义的,我想在另一个名为profile.php的php文件中调用它,但它仍然给我带来语法错误,我不知道如何修复它。 错误:不推荐使用:不应静态调用非静态方法User::GetUserId()注意:未定义变量:email in 使用getters和setters,函数 下面是profi

  • 可能重复: 为什么我得到“非静态变量不能从静态上下文引用”? 这是代码 错误说: 不能从静态上下文引用非静态类节点 为什么我不应该在main()方法中引用Node类?