多线程执行,为什么明明已经加了synchronized了,还是出现每次结果都不一样呢?

publicclassTest{privateinta=0;publicstaticvoidmain(String[]args){Testtest=newTest();f... public class Test {

private int a = 0;

public static void main(String[] args) {

Test test = new Test();

for (int i = 0; i <= 10; i++) {

new Thread(new Runnable() {
@Override
public void run() {
test.setA(test.getA() + 1);
}
}).start();
}

System.out.println(test.getA());
}

public int getA() {
return a;
}

public synchronized void setA(int a) {
this.a = a;
}
}
如果我把synchronide 放到run方法里则执行正确? 为什么呢? 锁不是当前对象吗? 只有一个test对象啊?
展开
 我来答
化银白m
2019-10-03 · TA获得超过358个赞
知道小有建树答主
回答量:397
采纳率:67%
帮助的人:61.3万
展开全部
程序运行时,cpu给每上线程分配的时间片断不一样,不同线程优先级别分配的时间片断也不一样,一个线程会在分配到的时间片断内执行一些代码,时间一到,就轮到其他线程执行了,这样cup轮循每个线程。时间片断是随机分配的,执行结果当然不一样!
禚方伏康平
2019-10-11 · TA获得超过1124个赞
知道小有建树答主
回答量:2023
采纳率:84%
帮助的人:9.8万
展开全部
synchronized(threadtest.class)是对threadtest这个类进行加锁,类里面的属性,方法都是同步的
synchronized(this){}是对{}这里面的内容进行加锁的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式