收录日期:2020/05/29 14:28:23 时间:2016/08/27 23:32:12 标签:Java SE
下面是我对线程同步的理解:
线程同步这个技术是在当同一块资源或者代码块被多个线程访问或调用,举个例子,当线程A和线程B同时访问了同一个全局变量 var1的话,假设 var1 的值为 5, 那么线程A 和 线程B 以 var1 必须大于0为条件同时开始对 var1 变量做减法操作,那么可能会出现当变量 var1 为 0时,可能线程A 或线程B 仍然在对变量 var1 进行减法操作,此时便有可能出现变量 var1 的值超出预期范围的情况发生.


我自己写了个程序实验了一下,运行了很多次,没有出现过我刚才说的那种超出预想结果的情况。
请问各位对这个情况怎么理解呢?又或者说我对线程同步的理解有误?
发下你的程序看看呢 我写了个测试的会出现-1的情况。

public class Test {

public static void main(String[] args) throws Exception {

new Thread(new TestThread()).start();
new Thread(new TestThread()).start();
}
}

class TestThread implements Runnable {
private static int i=10;
public void run() {
while(i>0){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i--;
System.out.println(Thread.currentThread().getId()+":"+i);
}
}
}
引用 1 楼 ss36290109 的回复:
发下你的程序看看呢 我写了个测试的会出现-1的情况。
Java code?123456789101112131415161718192021222324public class Test {     public static void main(String[] args) throws Exception {                 new Thread(n……

多谢,那么我对线程同步的意思理解的是对的吧
在弄个同步的测试,你对比下看看哦。

public class Test {

public static void main(String[] args) throws Exception {

new Thread(new TestThread()).start();
new Thread(new TestThread()).start();
new Thread(new TestThread()).start();
}
}

class TestThread implements Runnable {
private static int i = 10;

public void run() {
while (i > 0) {
synchronized (TestThread.class) {
if(i>0)
System.out.println(Thread.currentThread().getId() + ":" + i);
i--;
}


}
}
}
引用 3 楼 ss36290109 的回复:
在弄个同步的测试,你对比下看看哦。
Java code?12345678910111213141516171819202122232425public class Test {     public static void main(String[] args) throws Exception {         new Thread(new TestThread()……

我自己刚才也重新做了一些测试,明白了一些,以前对线程同步以及多线程下的数据安全老是用不好,由于demo的测试时间一般较短,发生错误的几率较低,所以经常会产生一些迷惑。像你给的代码中的情况(如下):

        new Thread(new TestThread()).start();
        new Thread(new TestThread()).start();

上面的代码中由于三个线程在并行运行,虽然在宏观上是并行运行的,但从输出的效果来看,还是一个一个运行的,只不过是在等待时间,当线程A运行完成之后变量 i 的已经为 0 了,但是由于线程B 还没有运行完,此时线程B会继续对变量 i 进行操作,结果就出现 -1了。应该是这么理解的吧,这些微观上的东西理解起来真费劲,只能怪自己以前操作系统没好好学了
线程不安全的代码并不是每次都会出错,这正是它危害最大的地方: 

一个偶尔会发生的错误比一个每次都会发生的错误排查起来要难得多,这样的错误隐患可能会通过所有的测试,被用户使用很长一段时间然后才发生,然后带来非常高昂的代价。
引用 6 楼 raistlic 的回复:
线程不安全的代码并不是每次都会出错,这正是它危害最大的地方: 

一个偶尔会发生的错误比一个每次都会发生的错误排查起来要难得多,这样的错误隐患可能会通过所有的测试,被用户使用很长一段时间然后才发生,然后带来非常高昂的代价。

明白,这是个概率问题,如果一个任务执行时间越长,那么造成错误的几率就会越大。昨天我在写demo时候发现一但增加线程的数量或者运行时间就很容易出错

DBGridCellClick方法应用的一个问题 提个简单点的问题,关于datetime型数据的数据转换 一栋N层的宿舍楼,想共享几条ADSL宽带上网,怎么个解决方案?谢谢!(欢迎电信的朋友!!!) 能不能让listview里面的某些行是有checkbox的,某些行不带checkbox? 我在本地能使用的eWebEditor(jsp版)上传到万网的java主机空间上去后就不能用了!?? insert into为什么没有数据插入?谢谢 请教sql和access的区别???要注意什么问题??? 怎么写这个查询语句?不算难吧 单问题! 能否让ListView固定列宽? 2000网络的怪问题 jbuilder下載 用ADO如何捕获数据库抛出的错误! 如何在程序中创建一个新的表格(Table)? 关于跳槽的时候新公司问我旧公司(现在所在的公司)的情况,请教 菜鸟在线急求帮忙!哪里错了? MySQL中查询和跟新碰到的问题,把我的数据库都弄乱了,请教该如何解决,谢谢! 谁有Veritas Storage EXEC Remote Agent的注册码啊 如何连接数据库 一个最初级的问题,大大门不吝赐教 怎样在excle中求一列数据中最靠近0的数? 请教一个session问题 如何关闭端口 请教WebModule组件Action的调用问题 请教学习.net要看点什么书,请高手推荐几本。 求助c#组件设计(新人) 急:很简单的问题,文本框如何显示数据库中一条纪录。 在线求算法-----------急!!!!火!!!! 发布 \"SQL SERVER 数据库备份恢复工具\" 菜鸟求寻C#.NET视频,那个不错请高手贡献一下!!!!!!!!