演示stop暴力停止线程导致数据不一致的问题,但是有些有趣的发现 (2017-07-03 21:25)
2017-07-03 21:30
405 查看
如注释所言
/** * 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; } }
相关文章推荐
- Oracle下批量update数据导致JDBC线程挂起的问题的解决
- 现在有这样一个问题 我把上W条数据插入表内,但是发现还有一条数据没进入表里.我想查出来是哪个数据没进去. 能用查询语句查出来吗?
- 讨论一个并发线程导致的数据保存失败的问题
- netcore服务程序暴力退出导致的业务数据不一致的一种解决方案(优雅退出)
- IdHTTP.post超时导致整个线程停止问题解决
- 解决项目中由于前端页面数据类型跟数据库类型不一致,导致获取数据为空引起问题
- 从头认识多线程-1.8 迫使线程停止的方法-暴力Stop方法
- 在使用多线程时,要注意:有些view使用子线程获得数据,但是view上的按钮却在主线程上
- 从头认识多线程-1.8 迫使线程停止的方法-暴力Stop方法
- 1.7.5停止线程(stop方法暴力停止)
- 1.7.7停止线程(stop停止造成数据不同步)
- 51单片机和HC05蓝牙模块对接成功,但是数据收发时候发现数据很多时候对不上问题解决
- HBase Indexer导致Solr与HBase数据不一致问题解决
- ShareUserId不一致导致数据丢失问题
- 关于textarea标签输出数据库数据时出现大量空格导致格式不一致的问题
- mysql新旧数据不一致导致的问题
- ListView中开启线程查询更新数据导致的ViewHolder错乱问题解决
- java高级多线程编程--关于线程的停止问题
- 才发现的超链接js导致网页中GIF动画停止的解决方法
- java高级多线程编程--关于线程的停止问题