15.stop引发的数据不一致
/**
* 数据不一致问题
* stop
*/
public class StopDemo {
public static Student student = new Student();
public static class Student{
private int id;
private String name;
public Student() {
id = 0;
name = "0";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public static class ChangeObjectThread extends Thread{
@Override
public void run() {
while (true){
synchronized (student){
int v = (int) (System.currentTimeMillis()/1000);
student.setId(v);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
student.setName(String.valueOf(v));
}
Thread.yield();
}
}
}
public static class ReadObjectThread extends Thread{
@Override
public void run() {
while (true){
synchronized (student){
if (student.getId()!=Integer.parseInt(student.getName())){
System.out.println(student.toString());
}
}
Thread.yield();
}
}
}
public static void main(String[] args) throws InterruptedException{
new ReadObjectThread().start();
while (true){
Thread t = new ChangeObjectThread();
t.start();
Thread.sleep(150);
t.stop();
}
}
//Student{id=1566203521, name='1566203520'}
//Student{id=1566203521, name='1566203520'}
//Student{id=1566203521, name='1566203520'}
//Student{id=1566203521, name='1566203520'}
//Student{id=1566203521, name='1566203520'}
//Student{id=1566203522, name='1566203521'}
//Student{id=1566203522, name='1566203521'}
//Student{id=1566203522, name='1566203521'}
//Student{id=1566203522, name='1566203521'}
//Student{id=1566203522, name='1566203521'}
//Student{id=1566203522, name='1566203521'}
//Student{id=1566203523, name='1566203522'}
//Student{id=1566203524, name='1566203523'}
//Student{id=1566203524, name='1566203523'}
//.....
}
/**
* 正确stop方式
*/
public class StopDemo2 {
public static Student student = new Student();
public static class Student{
private int id;
private String name;
public Student() {
id = 0;
name = "0";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public static class ChangeObjectThread extends Thread{
volatile boolean stopme = false;
public void stopMe(){
stopme = true;
}
@Override
public void run() {
while (true){
if (stopme){
System.out.println("exit by stop me");
break;
}
synchronized (student){
int v = (int) (System.currentTimeMillis()/1000);
student.setId(v);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
student.setName(String.valueOf(v));
}
Thread.yield();
}
}
}
public static class ReadObjectThread extends Thread{
@Override
public void run() {
while (true){
synchronized (student){
if (student.getId()!=Integer.parseInt(student.getName())){
System.out.println(student.toString());
}
}
Thread.yield();
}
}
}
public static void main(String[] args) throws InterruptedException{
new ReadObjectThread().start();
while (true){
Thread t = new ChangeObjectThread();
t.start();
Thread.sleep(150);
((ChangeObjectThread) t).stopMe();
}
}
}
15.stop引发的数据不一致的更多相关文章
- MySQL主从复制数据不一致问题【自增主键】
前言: 今天遇到主从表不一致的情况,很奇怪为什么会出现不一致的情况,因为复制状态一直都是正常的.最后检查出现不一致的数据都是主键,原来是当时初始化数据的时候导致的.现在分析记录下这个问题,避免以后再遇 ...
- netcore服务程序暴力退出导致的业务数据不一致的一种解决方案(优雅退出)
一: 问题提出 现如今大家写的netcore程序大多部署在linux平台上,而且服务程序里面可能会做各种复杂的操作,涉及到多数据源(mysql,redis,kafka).成功部署成后台 进程之后,你以 ...
- mysql 主从 数据不一致
用pt-table-checksum校验数据一致性 Jun 4th, 2013 主从数据的一致性校验是个头疼的问题,偶尔被业务投诉主从数据不一致,或者几个从库之间的 数据不一致,这会令人沮丧.通常我们 ...
- 使用Merkle树检测数据不一致(翻译)
背景 Cassandra的逆熵功能使用Merkle树来检测副本之间的数据不一致. 定义 Merkle树是一种哈希树,其中的叶子包含各个数据块的哈希值,父节点包含其各自的子节点的哈希值.它提供了一种有效 ...
- 解决Redis中数据不一致问题
redis系列之数据库与缓存数据一致性解决方案 数据库与缓存读写模式策略写完数据库后是否需要马上更新缓存还是直接删除缓存? (1).如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以马 ...
- C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- mysql]一次主从数据不一致的问题解决过程()
问题 要解决问题就是怎么对比不一致,然后在不影响业务的情况下,修复数据不一致的问题,把从库缺少的数据补上 下面是能想到和找到的几个方案 1 从新从0开始同步,虽然对主库的使用没有影响,但是那么大的数据 ...
- MySQL多字节字符集造成主从数据不一致问题
MySQL多字节字符集造成主从数据不一致问题 来自江羽 2013-04-27 16:03:56| 分类: 默认分类|举报|字号 订阅 转载: http://backend.blog.163.co ...
- redis入门(15)redis的数据备份和恢复
redis入门(15)redis的数据备份和恢复
随机推荐
- .NET面试题集锦①
一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.面向对象的思想主要包括什么? 答:任何事物都可以理解为对象,其主要特征: 继承.封装.多态.特点:代码好维护,安 ...
- Vue.js----router(路由)
什么是路由? 路由可看做是一个键值对,K-V. K => path()路径地址 V=> 处理请求的回调函数 前台路由 K => path()路径地址 V=> 路由组件 编写使用 ...
- MongoDB笔记【1】——安装MongoDB
SQL - 结构化查询语言 - 关系数据库全都同SQL来操作 1.安装MongoDB - 安装 - 配置环境变量 C:\Program Files\MongoDB\Server\3.2\bin - 在 ...
- vue项目轮播图的实现
利用 Vue-Awesome-Swiper插件来做轮播效果,github地址:https://github.com/surmon-china/vue-awesome-swiper 安装 npm i ...
- flask入门到入土
# Flask ## 0.Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用 ...
- javascript is ths best computer language
alert('javascript is one of the best computer languages')
- [CSP-S模拟测试]:y(DP+bitset)
题目背景 $\frac{1}{4}$遇到了一道水题,叕完全不会做,于是去请教小$D$.小$D$懒得理$\frac{1}{4}$,直接就离开了.于是,$\frac{1}{4}$只好来问你,这道题是这样的 ...
- JSP 获取访问者真正的IP地址
request.getRemoteAddr(),这种方法在大部分情况下都是有效的,但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了, 如果使用了反向代理软件,用re ...
- laravel 简单应用 redis
1.连接配置 database.php 中 测试用 都没做修改 2.创建测试路由及控制器 //添加路由 Route::get('testRedis','RedisController@testRedi ...
- git使用记录三:查看日志
git使用记录三: git log git log 的帮助文档 git log --help 查看最后面的两个日志记录 命令如下: git log -n number 比如: git log -n 2 ...