java并发中锁的问题

海栗 2017-07-17 05:57:39
为什么这段简单的自加程序运行结果会不确定?
public class Test {

public static void main(String[] args) {
new Test().run();
}

private void run() {
A a = new A();
for (int i = 0; i < 1000; i++)
new Thread() {
@Override
public void run() {
a.addCount();
}
}.start();
System.out.println(a.count);
}

}

class A {
public int count = 0;

public synchronized void addCount() {
count = count + 1;
}
}

在eclipse下编译运行结果有时会不等于1000
...全文
106 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
自由自在_Yu 2017-07-17
  • 打赏
  • 举报
回复
public class Test {
	 
    public static void main(String[] args) {
        new Test().run();
    }
 
    private void run() {
        final A a = new A();
        for (int i = 0; i < 20; i++){
            new Thread() {
                @Override
                public void run() {
                    a.addCount();
                }
            }.start();
        System.out.println(a.count);
        }
    }
     
}
加上括号,把每一个线程都打印出来看看执行结果, 0 1 1 2 3 4 5 6 8 8 10 11 12 13 14 15 16 16 17 18 这里是有20的数,但不是累加上去的 synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 打印结果有 6 8 8连续的三个,而不是6 7 8 ,说明执行第6次之后,第7次线程执行了addCount()方法,还没有打印的时候,第8次线程也执行了addCount()方法,所以此时count的值是8,然后两个线程都打印的是8
海栗 2017-07-17
  • 打赏
  • 举报
回复
引用 5 楼 pany1209 的回复:
[quote=引用 4 楼 Heliumxx 的回复:] [quote=引用 2 楼 pany1209 的回复:] 程序没问题,在addCount方法里面加上System.out.println(Thread.currentThread().getName()+":"+count);打印出来是没问题的,count最后等于1000,是System.out.println(a.count);这句话打印的时间有问题。。。。
运行结果是这样的[/quote] 你在addCount方法最后加上System.out.println(Thread.currentThread().getName()+":"+count);就知道结果是1000了,是System.out.println(a.count);这句没等所有线程执行完就打印出来了。。。。[/quote] 原来是这样 谢谢
李德胜1995 2017-07-17
  • 打赏
  • 举报
回复
引用 4 楼 Heliumxx 的回复:
[quote=引用 2 楼 pany1209 的回复:] 程序没问题,在addCount方法里面加上System.out.println(Thread.currentThread().getName()+":"+count);打印出来是没问题的,count最后等于1000,是System.out.println(a.count);这句话打印的时间有问题。。。。
运行结果是这样的[/quote] 你在addCount方法最后加上System.out.println(Thread.currentThread().getName()+":"+count);就知道结果是1000了,是System.out.println(a.count);这句没等所有线程执行完就打印出来了。。。。
海栗 2017-07-17
  • 打赏
  • 举报
回复
引用 2 楼 pany1209 的回复:
程序没问题,在addCount方法里面加上System.out.println(Thread.currentThread().getName()+":"+count);打印出来是没问题的,count最后等于1000,是System.out.println(a.count);这句话打印的时间有问题。。。。



运行结果是这样的
海栗 2017-07-17
  • 打赏
  • 举报
回复
引用 1 楼 yuxiangaaaaa 的回复:
这代码能运行起来吗??
在new Thread(){
这里不能用a吧,除非final A a = new A();
}


虽然我也觉得得加final,但eclipse没有报错欸,加了final之后结果也有时不对
李德胜1995 2017-07-17
  • 打赏
  • 举报
回复
程序没问题,在addCount方法里面加上System.out.println(Thread.currentThread().getName()+":"+count);打印出来是没问题的,count最后等于1000,是System.out.println(a.count);这句话打印的时间有问题。。。。
自由自在_Yu 2017-07-17
  • 打赏
  • 举报
回复
这代码能运行起来吗?? 在new Thread(){ 这里不能用a吧,除非final A a = new A(); }

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧