Abh*_*pta 2 java multithreading
我已经同步了Integer对象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();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意:整数对象是不可变的.所以,这里发生的是:每次你做一个"a ++"......编译器实际上做自动装箱; 最后...... 创建一个新的 Integer对象.
为了使代码正常工作,对于方法的所有调用,锁(要同步的对象)必须相同.
换句话说:对不断变化的对象的引用......不适合用作锁.相反,做一些像:
private final static Object LOCK = new Object();
Run Code Online (Sandbox Code Playgroud)
(使用final有助于确保此对象引用不会随时间而变化)然后:
synchronized(LOCK)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |