Re:为什么结果差别这么大?

[复制链接]
查看11 | 回复0 | 2021-1-29 05:15:11 | 显示全部楼层 |阅读模式
synchronized有两种用法(1)代码片段中出现用来约束一个对象(必须是对象)(2)作为一个方法的修饰符
你这里是第二种情况。当修饰方法时,还要看这个方法是否加了static关键字先看没有加的情况吧publicsynchronizedvoidmethod(){//....}
你的代码就是这样的。你创建了四个对象,t1~t4,由于你的方法没有加上static,所以这四个对象的method()方法是隔离的,之间没有关系,相互执行不会有影响和干扰
运行t1.method()是不会进入t2.method()的
t1.method()的确只有一个线程执行,但是这个和t2.method()有什么关系呢?
简单的说,t1.method()和t2.method()不是一个东西这个地方有点绕,仔细想一下吧。
如果给method加上static关键字,就不一样了:
publicstaticsynchronizedvoidmethod(){//...}
这样你创建4个对象t1~t4,它们引用的是同一个method了,此时当执行t1.method()时,就不能执行t2.method()因为它们是相同的。
lyaqys (木子) 在 ta 的帖子中提到:但是书上说加了synchronized之后,一次只能一个线程执行,就可以解决这个问题吗,为
什么我加了还是和没加一样呢?
JQK (金枪客) 在 ta 的帖子中提到:sum是static的当线程1运行了inttemp=sum-n;//此时temp假设为88,sum假设为94但是这个时候线程2可能跑来插上一脚也执行了一样的代码,结果一样temp=88,sum=94但是线程1又执行sum=temp;//sum=88现成2也执行sum=temp;//sum=88这个问题和你上面的问的问题有点关联,琢磨琢磨吧,我表达能力有限啊。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行