java 线程同步 synchronized

public class Test {

private int i = 0;

public Test() {

}

public int getI() {
    return i;
}

public void setI(int i) {
    this.i = i;
}

public static void main(String[] args) throws InterruptedException {
    Test t = new Test();
    Thread tt1 = new Thread(new TestThread(t));
    Thread tt2 = new Thread(new TestThread(t));
    Thread tt3 = new Thread(new TestThread(t));
    Thread tt4 = new Thread(new TestThread(t));
    tt1.start();
    tt2.start();
    tt3.start();
    tt4.start();
    tt1.join();
    tt2.join();
    tt3.join();
    tt4.join();
    System.out.println("ok");
}

}

public class TestThread implements Runnable {

Test t;

public TestThread (Test t) {
    this.t = t;
}

public synchronized void run() {
    t.setI(t.getI() + 10);
    System.out.println(t.getI());
}

}

 输出:
30
30
40
40
ok

问题 :
想要得到输出10 20 30 40,为什么加了synchronized还不行

2个回答

 public  void run() {
    synchronized(t){
        t.setI(t.getI() + 10);
        System.out.println(t.getI());
    }
}
code_monkey_sun
codeMonkey_sun 回复逗比123号: 感谢回答
2 年多之前 回复
u014034934
逗比123号 回复code_monkey_sun: synchronized的参数就是你要对什么进行加锁,你题目多个线程调用一个Test对象,所以只要在t上加锁就行了,你要用synchronized(this)的话意思是你要对TestThread对象加锁,但是你的代码中有new了4个TestThread对象所以不行,你只new一个对象的话就可以。
2 年多之前 回复
code_monkey_sun
codeMonkey_sun 我试过你这个方法,可以,还有种方法synchronized(this)可以吗
2 年多之前 回复

楼上应该正解,synchronized这个不是写在方法名字里的,在方法里

code_monkey_sun
codeMonkey_sun http://blog.csdn.net/ghsau/article/details/7424694
2 年多之前 回复
code_monkey_sun
codeMonkey_sun 但是有时候写在名字里是可以的,我弄不清楚
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!