收录日期:2019/07/17 12:57:08 时间: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时候发现一但增加线程的数量或者运行时间就很容易出错

怎么在wm5下这么简单的udp/tcp程序都运行不了 远程连接一个拥有固定IP地址的sql2000服务器,为何不能成功? 寻求vc6.0的安装程序 请问怎样在从数据库查出的数据相关字段自动添加链接,象在线音乐一样实现? 为将要出世的儿子,未来的花朵,姓名征集活动 请问哪里有最新的VISUAL STUDIO TEAM FOUNDATION SERVER下载呢? CSI招聘程序员(工作地点:北京、美国) 关于复制是否对被复制数据库有性能影响,是否可以运用在备份上? web.xml文件里几个参数是啥意思? 为将要出世的儿子,未来的花朵,姓名征集活动 关于 Header (\"Location:http://www.163.com\")跳转问题 播放器音量控制问题!急!!在线== 为将要出世的儿子,未来的花朵,姓名征集活动 [请教]关于地址重写的问题。我想很多人都遇到了这样的问题。 高薪诚聘北京地区JSP开发高手!!急急急 关于VC+SQL server数据库还原的问题 mm终于有了掌管偶经济的正当理由了 为将要出世的儿子,未来的花朵,姓名征集活动 如何在WINFROM 里面把图片保存在数据库里,从数据库里显示在窗体上? 第一次写简历, 有经验的老大们来指导下, 谢谢! loadMovie载入影片后,怎么跳转呀? 一○○分请教一问题 请教在access中如何通过语句知道有什么表,急啊。。。。。。 请问如何去掉字符串中的空格呢? 求MFC实现类似MS的cmd.exe的界面。只要有界面就可以了 怎么样在表单文件域里显示已上传文件的路径和文件名? 在线程中使用EndDialog以后结束线程出错,请大家来帮我看看! winform程序中如何显示HTML格式化后的文本,而不是html源代码 access的模糊查询 广州BEA安全信息技术研讨会-火热报名中