关于java线程的问题

moonaa 2018-05-08 03:36:26

package thread_test;

class Accum1 {
private static Accum1 a = new Accum1();
private int counter = 0;

private Accum1() {
};

public static Accum1 getAccum1() {
return a;
}

public void updateCounter(int add) {
counter += add;
}

public int getCount() {
return counter;
}
}

class ThreadOne implements Runnable {

Accum1 a = Accum1.getAccum1();

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 98; i++) {
a.updateCounter(1000);
try {
Thread.sleep(50);
} catch (InterruptedException ex) {
}
}
System.out.println("one " + a.getCount());
}

}

class ThreadTwo implements Runnable {

Accum1 a = Accum1.getAccum1();

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 99; i++) {
a.updateCounter(1);
try {
Thread.sleep(50);
} catch (InterruptedException ex) {
}
}
System.out.println("two " + a.getCount());
}

}

public class Accum {
public static void main(String[] args) {
ThreadOne t1=new ThreadOne();
ThreadTwo t2=new ThreadTwo();
Thread one=new Thread(t1);
Thread two=new Thread(t2);
one.start();
two.start();
}
}

上面是书上的代码,书上说是不会出现脏数据的情况,但是我自己敲出了试了下,为什么会有脏数据的现象,应该怎么改,代码才能对
...全文
686 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
txwh_2169 2018-05-10
  • 打赏
  • 举报
回复
两个线程同时对一个对象操作,会有线程安全问题,加锁
maradona1984 2018-05-09
  • 打赏
  • 举报
回复
private int counter = 0; 换成 private AtomicInteger counter = new AtomicInteger(); updateCounter改一下就行了
maradona1984 2018-05-09
  • 打赏
  • 举报
回复
引用 2 楼 qq_36387730 的回复:
首先我觉得楼主的代码是不存在线程安全性问题的,也就是说不会发生数据脏读的现象。
会有的
  • 打赏
  • 举报
回复
增加一个Object变量,给update方法加一把锁,就能防止脏数据了 class Accum1 { private static Accum1 a = new Accum1(); private int counter = 0; private Object obj = new Object();//对象 private Accum1() { }; public static Accum1 getAccum1() { return a; } public void updateCounter(int add) { synchronized (obj) {//加锁 counter += add; } } public int getCount() { return counter; } }
wangxizzz 2018-05-08
  • 打赏
  • 举报
回复
首先我觉得楼主的代码是不存在线程安全性问题的,也就是说不会发生数据脏读的现象。
武小凡 2018-05-08
  • 打赏
  • 举报
回复
要加线程锁。具体百度吧。

50,337

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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