【技术求教】关于同步监视器对象的理解有些疑问?

Mr_FenKuan 2018-10-25 08:56:05

public class Test {
private Integer a = 0;
public static void main(String[] args){
Test test = new Test();
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0;i<1000000;i++)
test.countA();
}
};


Thread thread = new Thread(runnable);
Thread threads = new Thread(runnable);
thread.start();
threads.start();
try{
thread.join();
threads.join();
}catch(Exception e){
e.printStackTrace();
}
System.out.println(test.a);

}
public void countA(){

synchronized (a){
a++;
}

}
}

这里我想不明白的是这个同步代码块中的同步监视器。
同步监视器:
多个线程如果要保持同步(排除其他线程进入代码块),多个线程的同步监视器必须是同一个对象。
当我创建另一个Integer b时,使用b这个变量作为同步监视的对象,问题又解决了。
【问题】
1.我上述的代码中,这个变量a是否属于同一个对象?
2.为什么使用变量b可以,而a不行。


希望有大仙可以解释一波给我这个刚在程序界行走江湖的小老弟听听。教导教导。老弟在先谢过大仙了!!!!!!

...全文
458 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2018-10-26
  • 打赏
  • 举报
回复
1.我上述的代码中,这个变量a是否属于同一个对象? 不属于 2.为什么使用变量b可以,而a不行。 因为a++是把a转成简单类型的int进行++(jdk1.5以前不支持对象直接++操作的),然后再把int转成Integer付给a,所以a已经不是原来的对象了

51,411

社区成员

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

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