日期:2014-05-20  浏览次数:20685 次

同步的小小问题
我知道同步代码块的时候只能锁对象或者类

synchronized(一个对象或者一个类){
//代码
}

但是呢,我想单独锁一个对象中的某个原始类型的成员变量。。
比如是个int型的:
int i;

这不能直接放在括号里,我给转了个型。。
synchronized(Integer)i){}

话说这样做是正常套路么。。有什么问题么??

------解决方案--------------------
楼主能否说下这样的需求是为了达到什么母的?这样的话比较好解释
------解决方案--------------------
Java code

同步块,示例代码如下:

public void method3(SomeObject so)

{

    synchronized(so)

    { 

       //….. 

    }

}

这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:

class Foo implements Runnable

{

        private byte[] lock = new byte[0]; // 特殊的instance变量

        Public void methodA() 

        {

           synchronized(lock) { //… }

        }

        //…..

}

注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock

= new Object()则需要7行操作码。

------解决方案--------------------
Java code


package Test;

public class TestForSynchronized {

    /**
     * @param args
     */
    public static void main(String[] args) {
        final Test test = new Test();

        Thread thread1 = new Thread(new Runnable() {
            public void run() {
                test.test();

            }
        }, "ta");
        
        Thread thread2 = new Thread(new Runnable() {
            public void run() {
                test.test();
            }
        }, "tb");
        
        thread1.start();
        thread2.start();

    }

}

class Test {
    int i = 0;

    public void test() {
        synchronized ((Integer) i) {//根据你的说法,把int变量i转型为Integer
            for (int j=0; j < 6;j++) {
                System.out.println("####################################");
                System.out.println(Thread.currentThread().getName() + "  " + i);
                System.out.println("####################################");
                
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                i++;
            }

        }
    }
}