java - 如果我不同步方法,后台发生了什么导致应用程序运行而控制台不打印任何内容?

标签 java multithreading thread-safety locking

我有一个有两个线程的主类。这两个线程运行其他类中定义的两个方法。

WaitNotifyMain.java

package com.practice.multithreading;

public class WaitNotifyMain {

    public static void main(String[] args) {
        WaitNotify waitNotify = new WaitNotify();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    waitNotify.produce();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        // lambda expressions Java 8
        Thread t2 = new Thread(() -> {
            try {
                waitNotify.consume();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


    }

}

WaitNotify.java

package com.practice.multithreading;

import java.util.LinkedList;
import java.util.List;

public class WaitNotify {


    /*created an object of linkedlist without Polymorphism  as we require 
    removeFIrst() method which is specific to the linkedList class*/
    private LinkedList<Integer> list = new LinkedList<Integer>();

    private final int LIMIT=10;

    public void produce() throws InterruptedException{
        int value = 0;
        while(true) {

            while(list.size()!=LIMIT) {
            list.add(value++);
            System.out.println("Added an element");

            }

        }

    }

    public void consume() throws InterruptedException{

        while(true) {
            while(!list.isEmpty()) {
                System.out.print("List size :"+list.size());
                int value = list.removeFirst();
                System.out.println("; value is: " +value);

            }

        }
    }
}

输出

Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
List size :1Added an element
; value is: 0
List size :10Added an element
; value is: 1
List size :10Added an element
; value is: 2
List size :10Added an element
; value is: 3
List size :10Added an element
; value is: 4
List size :10Added an element
; value is: 5
List size :10Added an element
; value is: 6
List size :10Added an element
; value is: 7
List size :10Added an element
; value is: 8
List size :10Added an element
; value is: 9
List size :10Added an element
; value is: 10
List size :10Added an element
; value is: 11
List size :10Added an element
; value is: 12
List size :10; value is: 13
List size :10; value is: 14
List size :9; value is: 15
List size :8; value is: 16
List size :7; value is: 17
List size :6; value is: 18
List size :5; value is: 19
List size :4Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
; value is: 20
List size :10; value is: 21
List size :10; value is: 22
List size :9; value is: 23
List size :8; value is: 24
List size :7; value is: 25
List size :6; value is: 26
List size :5; value is: 27
List size :4; value is: 28
List size :3; value is: 29
List size :2; value is: 30
List size :1; value is: 31
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
Added an element
List size :1Added an element
; value is: 32
List size :10Added an element
; value is: 33
List size :10Added an element
; value is: 34
List size :10Added an element
; value is: 35
List size :10Added an element
; value is: 36
List size :10; value is: 37
List size :10Added an element
Added an element
; value is: 38
List size :10Added an element
; value is: 39
List size :10Added an element
; value is: 40
List size :10Added an element
; value is: 41
List size :10Added an element
; value is: 42
List size :10Added an element
; value is: 43
List size :10Added an element
; value is: 44
List size :10Added an element
; value is: 45
List size :10Added an element
; value is: 46
List size :10Added an element
; value is: 47
List size :10Added an element
; value is: 48
List size :10Added an element
; value is: 49
List size :10Added an element
; value is: 50
List size :10Added an element
; value is: 51
List size :10Added an element
; value is: 52
List size :10Added an element
; value is: 53
List size :10Added an element
; value is: 54
List size :10Added an element
; value is: 55
List size :10Added an element
; value is: 56
List size :10Added an element
; value is: 57
List size :10Added an element
; value is: 58
List size :10Added an element
; value is: 59
List size :10Added an element
; value is: 60
List size :10Added an element
; value is: 61
List size :10Added an element
; value is: 62
List size :10Added an element
; value is: 63
List size :10Added an element
; value is: 64
List size :10Added an element
; value is: 65
List size :10Added an element
; value is: 66
List size :10Added an element
; value is: 67
List size :10Added an element
; value is: 68
List size :10Added an element
; value is: 69
List size :10Added an element
; value is: 70
List size :10Added an element
; value is: 71
List size :10Added an element
; value is: 72
List size :10Added an element
; value is: 73
List size :10Added an element
; value is: 74
List size :10Added an element
; value is: 75
List size :10Added an element
; value is: 76
List size :10Added an element
; value is: 77
List size :10Added an element
; value is: 78
List size :10Added an element
; value is: 79
List size :10Added an element
; value is: 80
List size :10Added an element
; value is: 81
List size :10Added an element
; value is: 82
List size :10Added an element
; value is: 83
List size :10Added an element
; value is: 84
List size :10Added an element
; value is: 85
List size :10Added an element
; value is: 86
List size :10Added an element
; value is: 87
List size :10Added an element
; value is: 88
List size :10Added an element
; value is: 89
List size :10Added an element
; value is: 90
List size :10Added an element
; value is: 91
List size :10Added an element
; value is: 92
List size :10Added an element
; value is: 93
List size :10Added an element
; value is: 94
List size :10Added an element
; value is: 95
List size :10; value is: 96
List size :10; value is: 97
List size :9; value is: 98
List size :8; value is: 99
List size :7Added an element
Added an element
Added an element
Added an element
Added an element
; value is: 100
List size :10; value is: 101
List size :9; value is: 102
List size :8; value is: 103
List size :7; value is: 104
List size :6; value is: 105
List size :5; value is: 106
List size :4; value is: 107
List size :3; value is: 108
List size :2; value is: 109
List size :1; value is: 110

>>>>>>>after this nothing in console<<<<<<<<<<<<<

我知道,由于它没有同步,所以它没有按预期工作,并且每次运行时我都会得到差异输出。

但我的问题是为什么控制台显示我的应用程序正在运行,而我在控制台中看不到任何输出。

有人可以解释一下这种行为吗?

我尝试了更多的东西,如果将 Thread.sleep() 放入外部循环中,那么它会继续在控制台中无限打印,如果我将 syso 在外部循环中,我也会无限期地在控制台中获得输出。

这是什么奇怪的行为。

最佳答案

在两个 while(true) 循环中添加输出,您将看到其中一个线程被卡住,可能另一个线程没有获得量子时间。

关于java - 如果我不同步方法,后台发生了什么导致应用程序运行而控制台不打印任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61701177/

相关文章:

java - 类初始化和同步类方法

c# - 使用锁是否比使用本地(单个应用程序)信号量具有更好的性能?

java - java中一个类可以有多个静态锁吗

java - 使用 ZXing 在 Android 上编码联系人信息 (MeCard)

java - java中列表变量的好名字

java - 编写一个 junit 测试来测试集合的大小

java - TestNg 多线程问题。 TestNg 不尊重子线程

c# - Java 线程创建性能 vs C# 线程创建性能 vs C++( native 线程)?

c# - 澄清 C# 字典上的读写

java - 这种属性重写在 Maven3 中有效吗?