当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:
class Foo implements Runnable
{
private byte[] lock = new byte[0]; // 特别的instance变量
Public void method()
{
synchronized(lock) { //… }
}
//…..
}
注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。
请问,特别的instance变量起到什么作用?这个怎么同步的?来帮帮忙啊?
解决方案 »
- Runtime.getRuntime().exec(command);如何使用相对exe路径
- 关于一个JS替换的问题!
- Swing编程中关于窗口重绘的问题(困扰我好几天了,救命啊。。)
- JDBC的问题:我用JDBC-ODBC桥能用,用纯JDBC怎么就用不了呢?????
- 如何从右向左来画图
- 在java里实现net send命令
- 小妹有个问题,希望高手帮忙!!!
- 怎样使JWindow、JLabel等控件的背景变成透明的?
- 接着请教applet运行在MS的1.1的JVM上的问题,--(如何在编译或运行时查错)
- 请问下在运行环境下缺少第三方jar的问题
- j2se问题!请教高手!
- 利用循环写监听程序问题
_lock对象加上同步锁,其他的线程如果来访问,就会必须等到同步锁被释放之后才会被唤醒。
public class TestDemo {
private byte[] lock = new byte[0];
public synchronized void method1() {
for (int i = 0; i < 10; i++) {
System.out.println("method1");
Thread.yield();
}
}
public void method2() {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
System.out.println("method2");
Thread.yield();
}
}
}
public static void main(String[] args){
final TestDemo td=new TestDemo();
new Thread(){
public void run(){
td.method1();
}
}.start();
td.method2();
}}在其它对象的同步需要确保所有相关的操作都是在同一个对象上同步的。