почему stringbuilder не генерирует исключение одновременной модификации, когда потоки пишут и читают одновременно - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь сгенерировать исключение одновременной модификации, используя контрольный пример junit в этом случае, поскольку stringbuilder не является потокобезопасным, он должен выдавать исключение, когда чтение и запись происходят одновременно. я запускал его несколько раз и получал бесконечный вывод l oop, но без одновременных исключений. Как создать исключение одновременной модификации с использованием этого кода?

package com.blog.article.threading.example;

public class Logger {

    private StringBuilder contents = new StringBuilder();

    public void log(String message) {
        contents.append(Thread.currentThread().getName());
        contents.append(message);
        contents.append("\n");
    }

    public String getContents() {
        return contents.toString();
    }
}

Тестовый класс:

package com.blog.article.threading.example;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class LoggerTest extends Thread {

    @InjectMocks
    Logger logger;

    @Test
    public void testWithStringBuilderObject() throws InterruptedException {
        for (int i = 0; i <= 5; i++) {
            Thread t = new Thread() {
                public void run() {
                    int i = 0;
                    while (true) {
                        logger.log("A");
                        System.out.println(logger.getContents());
                        try {
                            Thread.sleep(20);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            };
            t.start();
        }

        while (true) {
            System.out.println("Main Thread");
        }
    }
}

Зависимость Gradle:

plugins {
    id 'java-library'
}

repositories {
    jcenter()
}

dependencies {
    api 'org.apache.commons:commons-math3:3.6.1'

    repositories { jcenter() }

    dependencies { testImplementation 'org.mockito:mockito-core:2.7.22' }
    implementation 'com.google.guava:guava:28.0-jre'

    testImplementation 'junit:junit:4.12'
}
...