junit4 - 为什么stringbuilder在线程同时读写时不抛出并发修改异常
问题描述
我正在尝试使用 junit 测试用例生成并发修改异常。在这种情况下,由于 stringbuilder 不是线程安全的,它应该在读取和写入同时发生时给出异常。我多次运行它并获得无限循环输出但没有并发异常。如何使用此代码生成并发修改异常?
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");
}
}
}
摇篮依赖:
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'
}
解决方案
推荐阅读
- django - Django Rest Framework 传递给 ModelSerializer 的参数是什么意思?
- fonts - WebStorm 2018 项目窗格:如何更改字体颜色?
- firewall - 具有内部和外部网络的透明代理 Squid
- ios - 有没有更简单的方法来替换在 xcode 中设置到 xib 中的所有字体?
- postman - 邮递员休息客户端每次响应时都会给出 404 错误
- php - 如果我们在 multiselect 上写任何东西,如何将文本插入数据库表?
- r - 使用包 DLM 和 FKF 的状态空间
- java - 如何在“X”号之后显示插页式广告。应用中的点击次数?
- java - 用没有多个发送键的文本填充所有文本区域(循环)?
- css - 动态圆圈导航菜单