演示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 服务停止的现象,以及使用几种常用子线程的注意事项.因为我们有时可能需要开启多个线程执行复杂的逻辑,如 ... 
随机推荐
- Docker Overlay 工作原理
			Docker 原生Overlay 网络工作流程 如图:有两个Container 独立的容器节点.他们通过Overlay网路进行通信. 网卡设备 Container eth0:eth0它是Overlay ... 
- Python爬虫(三)——开封市58同城出租房决策树构建
			决策树框架: # coding=utf-8 import matplotlib.pyplot as plt decisionNode = dict(boxstyle=') leafNode = dic ... 
- python传参是传值还是传引用
			在此之前先来看看变量和对象的关系:Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象.而变量是对象的一个引用(又称为名字或者标签),对象的操作都是通过引用来完成的.例 ... 
- opencv学习之路(30)、分水岭算法及图像修补
			一.简介 二.分水岭算法 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat srcImg = ... 
- [c/c++] programming之路(20)、字符串(一)
			一.字符串 #include<stdio.h> #include<stdlib.h> void main(){ ]="notepad"; printf(&q ... 
- vs相同变量高亮显示
			https://blog.csdn.net/sinat_33718563/article/details/79241129 在VS2010中调试工程中,常常需要观察相同变量名在不同代码处的位置,VS默 ... 
- iOS开发 -------- transform属性(形变)
			一 transform属性 在OC中,通过transform属性可以修改对象的平移,比例和旋转角度 常用的创建transform结构体的方法分两大类 (1) 创建"基于控件初始位置&qu ... 
- asp.net   json,对象,字符串的相互转换
			//object 转json格式字符串 public static string ObjectToJsonString(this object obj) { return JsonConvert.Se ... 
- mysql ERROR 1045 和2058时(28000): 错误解决办法
			mysql ERROR 1045 (28000): 错误解决办法 听语音 | 浏览:54286 | 更新:2018-02-23 14:34 | 标签:mysql 1 2 3 4 5 6 7 分步阅读 ... 
- CSS【04】:CSS组合选择器
			组合选择器 群组(并集)选择器 作用:给所有选择器选中的标签设置属性,可以同时控制多个选择器 格式: 选择器1, 选择器2 { 属性: 值; } 注意点: 必须使用,来连接 选择器可以使用标签名称.i ... 
