我已经同步了整数对象a,我期待输出1 2 3 4 5 6 7 8 9 但它仍然给我其他输出。问题在于我已经同步了每个线程试图访问的变量。
package thread;
public class BasicThread extends Thread {
static Integer a=new Integer(0);
void incr() {
synchronized (a) {
a++;
System.out.println(a);
}
}
public void run() {
incr();
incr();
incr();
}
public static void main(String[] args) throws InterruptedException {
BasicThread bt=new BasicThread();
BasicThread bt1=new BasicThread();
BasicThread bt2=new BasicThread();
bt.start();
bt1.start();
bt2.start();
}
}
答案 0 :(得分:5)
请注意:整数对象是不可变的。所以,这里发生的是:每次你做一个" a ++" ...编译器实际上做自动装箱;最后......创建一个 new 整数对象。
为了让您的代码正常工作,您对该方法的所有调用的锁定(您正在同步的对象)必须相同。
换句话说:对不断变化的对象的引用......不适合用作锁。相反,做一些像:
private final static Object LOCK = new Object();
( final 的使用有助于确保此对象引用不会随时间变化)然后:
synchronized(LOCK)
答案 1 :(得分:0)
使用唯一的对象进行同步。当您更改整数时,会创建一个新的整数,因为它们是不可变的。
示例:
public class BasicThread extends Thread {
static Integer a = new Integer(0);
private static String ab = "";
void incr() {
synchronized (ab) {
a++;
System.out.println(a);
}
}
public void run() {
incr();
incr();
incr();
}
}