收录日期:2019/05/22 09:16:25 时间: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时候发现一但增加线程的数量或者运行时间就很容易出错

asp.net中创建新目录问题:Directory.CreateDirectory 请教,关于自建对象的问题 如何在adoquery的固定字段中,判断哪一个是主键? 6 请大家帮我看看这个错误为什么 CDONTS 发html格式邮件,请问高手图片怎么带上. WSAD5.0注册 7 tomcat下配置两个连接池oracle池+mysql的池,呵呵 请教一下sql*plus中的change命令怎么用啊? 关于APACHE安装的问题!急..... 求助滚动代码 求助:需要写一份产品方案或产品架构方面的文档,以前没写过想参考一下别人的,不知你们能否提供,或是告诉我网上哪里有得下载,我搜过可 不支持电脑播放的vcd有什么办法让光驱读出来? 哪有.net中文版谢谢 WSAD5.0注册问题 这台计算机上的代理设置没有针对 Web 发现进行正确配置。 如何jb9修改tomcat调试端口的问题? 如何操作QQ登陆窗口??? 学习ASP有一周了,但是,还没有形成一定的编程思维,所以,哪为朋友角教我该如何学? 大家帮忙设计一个数据结构:说出思路即可 这个页面最下面的播放器是怎么做的,有代码吗?高手来,给分100 新婚的日子---<农村故事>!(转贴) 我的查询老是出问题 小问题,放分,为什么 ; 在编写程序的时候,有时候不留意,输错了个单词,要找的非常辛苦,所以,有没有什么软件帮忙啊? 大家帮我测试,发现亮点给代码,发现错误填写测试报告者给分,给分! 在PHP中使用InterBase6.5作数据后台,在写论坛中分页显示是怎么处理的? 有谁研究过人的心理吗?谁来分析分析我的心理?????? 显示图片和按钮