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

多线程同步问题

寿飞飙
2023-03-14

线程2:4

.

.

线程3:7

线程3:8

线程1:9

这是我为正在执行线程的类编写的代码

public class numberentrycreater implements Runnable
{
    final private int max = 100;
    private static int count = 1;
    private String createdBy;
    private SharedBuffer buffer;

    public numberentrycreater(String createdBy ){
        this.createdBy = createdBy;
    }

    public synchronized void  increment(NumberEntry ne){
        System.out.println(ne.getCreatedBy()+": " + ne.getValue());
        if(count<=max){
            count++;
        }
    }

    @Override
    public  void run()
    {
        for(int i=0; i<25; i++){
            if(count<=max){
                NumberEntry ne = new NumberEntry(count,createdBy);
                increment(ne);
                try
                {
                    Thread.sleep(100);
                } catch (InterruptedException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

我认为问题在于NumberEntry对象的创建。但我不太确定怎么修好它。如果有人能以任何方式帮助我,那就太好了:)。

共有1个答案

贡和裕
2023-03-14

这里的同步有点混乱,你得到了很多竞争条件。

首先,在进入synchronized方法之前,您要创建numberentry,因此没有理由认为多个线程不会接收相同的数字。

另外,synchronized方法实际上不会同步。作为方法选项的synchronized只是synchronized(this){...}的缩写,而this在本例中是每个线程唯一的可运行的,因此它们可以同时输入它。你需要在他们共享的东西上同步。尝试在synchronized(numberentrycreater.class){ } 的方法中放置一个块。

 类似资料:
  • 互斥锁 互斥锁的本质是当一个 goroutine 访问的时候,其它 goroutine 都不能访问 这样就能实现资源同步,但是在避免资源竞争的同时也降低了程序的并发性能,程序由原来的并发执行变成了串行 案例 有一个打印函数, 用于逐个打印字符串中的字符,有两个人都开启了goroutine去打印 如果没有添加互斥锁,那么两个人都有机会输出自己的内容 如果添加了互斥锁,那么会先输出某一个的,输出完毕之

  • 当我尝试通过启动不同的线程来执行所有同步方法时,我在一个类中有三个同步方法,我看不到同步的输出,在对象上没有获得锁 公共类DisplayMessage{ }线程类: 公共类 MyThread 扩展了线程 { }Thread2类:公共类MyThread2扩展线程{ } 线程 3 类: 包装Synchronization.classlock; 公共类MyThread3扩展线程{ } 使用main方法生

  • 我有两个线程的问题,似乎没有正确同步。我基本上有一个布尔值名为“已占用”。当没有线程启动时,它被设置为false。但是当一个线程启动时,线程集被占用是真的,我有一个类,它有线程(run),它们调用下面的函数。 这是一个模拟银行的示例,它接收一个金额(初始余额),然后随机执行取款和存款。我的教授提到了一些关于从取款线程到存款线程的信号?这是怎么回事?在提取线程中,它应该运行到余额为2低,并等待存款线

  • 本文向大家介绍详解C#多线程之线程同步,包括了详解C#多线程之线程同步的使用技巧和注意事项,需要的朋友参考一下 多线程内容大致分两部分,其一是异步操作,可通过专用,线程池,Task,Parallel,PLINQ等,而这里又涉及工作线程与IO线程;其二是线程同步问题,鄙人现在学习与探究的是线程同步问题。 通过学习《CLR via C#》里面的内容,对线程同步形成了脉络较清晰的体系结构,在多线程中实现

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

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