演示stop暴力停止线程导致数据不一致的问题,但是有些有趣的发现 (2017-07-03 21:25)
如注释所言
/**
* Created by weiwei22 on 17/7/3.
*
* 这里主要是为了演示stop导致的数据不一致的问题。stop会暴力的结束线程并释放锁,所以有可能在恰好写了一半数据的时候,就被stop并释放了锁。
* 读线程此时获得锁就有可能读取到不一致的数据。
* 但是发现几个有意思的现象:
* 1、如果M<N,那么所有的Thread1线程实例都没有机会执行就被干掉了,
* 因为新创建的Thread1的实例t1在执行到(1)处时,休息N毫秒,几乎同时主线程执行到(2)处,休息M毫秒,如果M<N,就意味着主线程会先醒过来,
* 然后先下手为强,干掉t1;
* 2、如果M>=N,意味着t1有机会执行,或者不会执行。但是如果M>N,但是M<2N,则意味着t1只有执行一次的机会。因为t1执行完一轮后,立即进入2轮,但是第2轮
* 休眠还没结束,主线程就醒了,然后干掉了t1;
* 3、如果M>=2N,那么t1就有多次执行的机会,这取决于到底是几倍的关系;
*/ public class ThreadMain8 {
private static User mU = new User(); public static void main(String[] args) throws InterruptedException {
Thread2 t2 = new Thread2("读取线程");
t2.start(); int index = 1;
while (true) {
Thread1 t1 = new Thread1("写入线程 " + index);
index++;
t1.start(); //(2)处
Thread.sleep(201);//M毫秒 t1.stop();
}
} private static class Thread1 extends Thread {
public Thread1(String name) {
super(name);
} @Override
public void run() {
while (true) {
synchronized (mU) { mU.id = (int) (System.currentTimeMillis() / 1000); //(1)处
try {
Thread.sleep(100); //N毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
mU.name = mU.id; SystemUtil.p(Thread.currentThread().getName() + "--写入 Name = " + mU.name);
}
}
}
} private static class Thread2 extends Thread {
public Thread2(String name) {
super(name);
} @Override
public void run() { while (true) {
synchronized (mU) {
if (mU.name != mU.id) {
SystemUtil.p(Thread.currentThread().getName() + "--读取 Name = " + mU.name + ", id = " + mU.id);
}
}
}
}
} private static class User{
public int id = 0;
public int name = 0;
}
}
演示stop暴力停止线程导致数据不一致的问题,但是有些有趣的发现 (2017-07-03 21:25)的更多相关文章
- Redis面试题记录--缓存双写情况下导致数据不一致问题
转载自:https://blog.csdn.net/lzhcoder/article/details/79469123 https://blog.csdn.net/u013374645/article ...
- pt-osc改表导致数据不一致案例分析
2016-06-10 李丹 dba流浪猫 我们平时除了解决自己问题外,有时候也会协助圈内人士,进行一些故障排查,此案例就是帮某公司DBA进行的故障分析,因为比较典型,特分享一下,但仅仅是分享发生的过程 ...
- netcore服务程序暴力退出导致的业务数据不一致的一种解决方案(优雅退出)
一: 问题提出 现如今大家写的netcore程序大多部署在linux平台上,而且服务程序里面可能会做各种复杂的操作,涉及到多数据源(mysql,redis,kafka).成功部署成后台 进程之后,你以 ...
- 二、java多线程编程核心技术之(笔记)——如何停止线程?
1.异常法 public class MyThread extends Thread { @Override public void run() { super.run(); try { for (i ...
- 三年之久的 etcd3 数据不一致 bug 分析
问题背景 诡异的 K8S 滚动更新异常 笔者某天收到同事反馈,测试环境中 K8S 集群进行滚动更新发布时未生效.通过 kube-apiserver 查看发现,对应的 Deployment 版本已经是最 ...
- 解决Redis中数据不一致问题
redis系列之数据库与缓存数据一致性解决方案 数据库与缓存读写模式策略写完数据库后是否需要马上更新缓存还是直接删除缓存? (1).如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以马 ...
- 十七 能停止的线程 暴力停止 和 interrupt/return方法
1:stop: 使用stop() 停止的线程则是非常暴力的. stop() 已经废弃了,因为: 1 如果强制停止则有可能使得一些清理工作得不到完成. 2 对锁定的对象进行了“解锁”,导致数据得不到同步 ...
- 由数据迁移至MongoDB导致的数据不一致问题及解决方案
故事背景 企业现状 2019年年初,我接到了一个神秘电话,电话那头竟然准确的说出了我的昵称:上海小胖. 我想这事情不简单,就回了句:您好,我是小胖,请问您是? "我就是刚刚加了你微信的 xx ...
- 子线程导致 Windows 服务停止的情况(Topshelf 结合 Quartz.NET)
Ø 前言 本文主要记录子线程导致 Topshelf 和 Quartz.NET 的 Windows 服务停止的现象,以及使用几种常用子线程的注意事项.因为我们有时可能需要开启多个线程执行复杂的逻辑,如 ...
随机推荐
- sublime-text3打造markdown编辑器
编辑插件 sublime自带的markdown语法高亮并不是很友好,推荐安装Markdown Editing,github主页然后在视图->语法里选择MarkdownEditing启用,支持三种 ...
- LeetCode258 各位相加
题目链接:https://leetcode-cn.com/problems/add-digits/ 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: ...
- Nginx优化详解-------超详细
一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1. worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cp ...
- SQL Server 2012安装时报错,错误 0x80070422怎么解决?解决方法。
步骤一: Win+R打开运行窗口,输入services.msc 打开服务窗口 步骤二: 找到并启用"Windows Update" 成功进入下一步!
- activiti5/6 系列之--BpmnModel使用
BpmnModel对象,是activiti动态部署中很重要的一个对象,如果BpmnModel对象不能深入的理解,那可能如果自己需要开发一套流程设计器,使用bpmn-js使用前端或者C/S展现流程流转而 ...
- 【题解】JSOIWC2019 Round2
题面: 题解: T1: 毕竟是tg膜你,不会太难 就是一道简单贪心 首先,对于a<=b的所有物品,一定是贪心的按照a从小到大放入. 先假设剩下的物品可以按照某种顺序放进去,那么可以得到一个最终空 ...
- 在数据库级别还是在service层进行级联删除
在数据库配置级联删除的话,父表删除子表也删除.但是应该将维护代码放在一处,不要在service上删除父表,而在数据库层面级联删除子表,应该都在service层上进行删除.
- non-ZenoAndAcceptingLocation
PATTERN系列的番外篇 对non-Zeno的概念进行了明晰 accepting:if infinitely often the same state non-Zeno:if time diverg ...
- 【依赖注入】Unity和Autofac
全面理解ASP.NET Core依赖注入:https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html MSDN:https://docs.mic ...
- java常用类介绍
1 日期时间.Math.枚举 1.1 日期时间 计算机如何表示时间? GMT时间指格林尼治所在地的标准时间,也称为时间协调时(UTC),其他地区的时间都是相对于GMT时间的偏移. 北京位于东八区 = ...