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

Java同步线程

谭嘉容
2023-03-14

我有3节课是这样的:

来源Java语言

public class Source extends Thread{
    private int x= 0;
    public void increment(int id){
          x++;
          System.out.println(id+" "+x);
    }
}

任务Java语言

public class Task extends Thread{
      private Source source;
      private int id;
      public Task(Source source, int id){
            this.source=source;
            this.id=id;
      }
      public void run(){
             for (int i=0;i<100;i++){ 
                 try{Thread.sleep(1000);}catch(InterruptedException e){}
                 source.inc(id);
             }
      }
}

主要的Java语言

public class Main{
      public static void main(String[] args) throws IOException{
             Source source = new Source();
             Task t1=new Task(source,1);
             Task t2=new Task(source,2);
             t1.start();
             t2.start();
      }
}

当类源的x等于4时,只有一个任务继续递增x,直到x等于8,我们恢复正常。结果如下:

1 1
2 2
1 3
2 4
1 5
1 6
1 7
1 8
1 9
1 10
2 11
1 12
2 13
...

要获得此结果,我需要修复什么?

共有1个答案

夏知
2023-03-14

基本上,您有两个线程修改相同的变量x。对于执行顺序没有任何保证。您应该同步。

 类似资料:
  • 问题内容: 我正在使用Android App,无法将View与硬件同步。让我解释。 1)我从线程1的run方法中基于数组A中存储的随机值(即随机睡眠)对Android的麦克风进行静音和取消静音。 2)我画出反映麦克风静音的蓝色脉冲。这是通过独立的View类完成的。 3)通过从倒数计时器的onTick内调用,我在上面视图中绘制的图形上移动了一条红线。 我以这种方式一个接一个地启动两个线程: 线程1.

  • 主要内容:1 什么是Java 线程同步,2 为什么使用Java线程同步,3 Java同步类型,4 Java线程同步的类型,5 线程互斥,6 Java锁的概念,7 线程并发问题引发数据不一致,8 Java synchronized方法的例子1,9 Java synchronized方法的例子21 什么是Java 线程同步 Java中的同步是控制多个线程对任何共享资源的访问的能力。 Java同步是更好的选择,我们希望只允许一个线程访问共享资源。 2 为什么使用Java线程同步 Java线程同步主要用

  • 我试图更好地理解Java多线程。所以,我知道这句话说只有一个线程可以访问一个对象实例,从而调用该实例的方法(例如,在这种情况下,类 中的减方法。 但是,当你仍然有相同的 会发生什么,但两个线程与不同的 相关联,完全试图调用 的方法?我以为不的消息永远不会被打印出来,但它确实打印出来了。毕竟,仍然只有一个对象实例 ,这是否意味着同步不适用于此示例?

  • 本文向大家介绍Java 线程同步详解,包括了Java 线程同步详解的使用技巧和注意事项,需要的朋友参考一下 Java 线程同步根本上是要符合一个逻辑:加锁------>修改------>释放锁 1、同步代码块 示例如下: 示例中希望按照顺序依次输出整数。 通常同步代码块是需要锁定的对象,一般是需要并发访问的共享资源,任何线程在修改指定资源之前都首先对该资源加锁,在加锁期间其它线程无法修改该资源。从

  • 下面的代码创建了一个新的custom um < code > Thread ,并等待线程结束,直到主线程再次激活。 > < li >我不太明白它是如何工作的。为什么< code > myth read . wait();立即接到电话? < li> 为什么不改用< code>Thread.join()? 公共静态void main(String[] args) {

  • 所以我有一个代码: 所以我将线程添加到我的线程列表中,然后启动这些线程。这是MyThread类: 我想做一个程序来创建线程,将它们添加到列表中,调用它们,但是每个线程都应该等到前一个线程结束它的任务。因此输出应该如下所示: 如何使用实现这一点?我尝试了使用的不同方法,但失败了。