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

不同类中的同步属性

卫嘉佑
2023-03-14

我试图设置两个线程,它们在另一个类中增加或减少一个整数。我对这个属性的同步有一些问题。

这是我的主要类,我在其中设置了线程和计数器类:

public class Main {
public static void main(String[] arg) {
    Counter c = new Counter(10000000);
    Thread1 t1 = new Thread1(c);
    Runnable2 r2 = new Runnable2(c);
    Thread t2 = new Thread(r2);
    t1.start();
    t2.start();
    System.out.println(t.getNumber());
    }
}

这是我的柜台课:

public class Counter{
private int number;
private static final Object countLock = new Object();

public Counter(int number){
    this.number= number;
}

public void increase(){
    synchronized(countLock){
        number++;
    }
}

public void decrease(){
    synchronized(countLock){
        number--;
    }
}

public int getNumber(){
    return number;
}

}

这是我的Thread1类:(runnable类是一样的,只是用“实现Runnable”而不是“扩展线程”)

public class Thread1 extends Thread{
private Counter c;

public Thread1(Counter c){
    this.c = c;
}

public void run(){
    for(int i = 0; i < c.getNumber(); i++){
        c.increase();
    }
}
}

但是,我的输出始终是10000000。尽管我同步了两种方法。有人能解释这是怎么回事吗?

共有3个答案

商绍元
2023-03-14
匿名用户

首先,这实际上永远不会结束,因为您在同一循环中增加了for循环中用作上限的值。不确定这是否是所需的行为。

其次,您的<code>System.out。println将(很可能)始终打印Counter中使用的初始值,因为线程没有时间完成工作。出于测试目的,您可以添加以下内容:<code>TimeUnit.SECONDS.sleep(10) 。不过,对于更复杂的方法,我建议您查看java.util.concurrent。执行器java.util.concurrent。ExecutorService(有很多示例)。

第三,如果您将< code>Counter的< code>int number替换为< code > Java . util . concurrent . atomic . atomic integer ,您的生活会轻松得多。

慕容嘉荣
2023-03-14

当我运行代码时,System.out.println(t.get());在任一线程启动之前被执行。

拓拔富
2023-03-14

添加<code>t1.join();t2.连接(),以便线程在main线程执行sysout之前完成任务。

另一方面,我认为线程永远不会从 for 循环中出来,因为 c.getNumber() 不断增加。

我想你想

int数字=c.get数字();对于(int i=0; i

代替

< code > for(int I = 0;我

 类似资料:
  • 问题内容: 我面临有关Java方法同步的问题。希望我能简要解释一下: 我在两个不同的类中,在两个不同的包中有两个不同的方法。就像是: 好的,所以现在我需要同步这两个 不是thread的方法 。到目前为止,我有两种不同的方法: 共享信号量 。 在和外部创建一个共享的静态信号量,例如: 无论如何,我真的不知道JVM是否会将其视为共享信号量。 已同步(SharedClass.class) 。 使用共享类

  • 我在阅读oracle的多线程官方教程时,遇到了这个例子(假设< code>c1和< code>c2从未一起使用): 据说通过使用锁1 然而,我并不认为这有助于减少阻塞,因为它们彼此之间没有依赖关系。我有多个线程同时运行这两个方法,当我使用lock对象和this关键字时,性能非常相似。 有人可以帮助解释我的困惑吗?喜欢用一个例子来说明差异。 除了这里的讨论,这篇文章也帮助澄清了我的疑虑。要点:将sy

  • 问题内容: 我正在查看包含同步方法的第三方库中的一些代码,在此方法中,有一个锁定在实例变量上的同步块。与此类似: 这有意义吗?如果是这样,在同步方法中使用同步语句有什么好处? 鉴于同步方法锁定了整个对象,对我来说似乎是多余的。在使用非私有的实例变量时,这种方法是否有意义? 问题答案: 在您的示例中,该方法 同时 锁定了和的实例。其他方法可能仅锁定对象的实例 或 对象。 因此,是的,这完全取决于他们

  • 大家好,我正在学习一个教程,我对一些我尝试应用从教程中获得的知识的事情很好奇。 我很好奇的是Runner类中的CountDownLatch和Process类中的CountDownLatch应该是不同的,但在Process类的CountDownLatch中达到零似乎也会触发。Await我在Runner类中放置了它。当我只将CountDownLatch作为参数传递给Process类,而Process类

  • 我有一个REST API,它返回JSON响应为: 有时它会返回: 我有一个这样的POJO: 那么,有没有办法(除了编写自己的自定义反序列化程序)在 Jackson2 中帮助我将 JSON 中的通道映射到字符串类型(当它是时)和类型(当它是 JSON 对象时)? 或者换句话说,Jackson中是否有一种方法可以通过变量的映射,而不仅仅是通过?

  • 在Swift中,有人能解释一下如何用从原始属性子类的另一个对象重写超类的属性吗? 如果将底盘改为“var”,则会出现错误: 我在指南中“重写属性”下找到的唯一东西表明,我们必须重写getter和setter,这可能用于更改属性的值(如果它是'var'),但更改属性类怎么办?