Я пытаюсь сгенерировать исключение одновременной модификации, используя контрольный пример 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'
}