首页 技术 正文
技术 2022年11月6日
0 收藏 399 点赞 514 浏览 1327 个字

如注释所言

/**
* 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;
}
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,488
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,488
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,127
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,289