我知道同步代码块的时候只能锁对象或者类synchronized(一个对象或者一个类){
//代码
}但是呢,我想单独锁一个对象中的某个原始类型的成员变量。。
比如是个int型的:
int i;这不能直接放在括号里,我给转了个型。。
synchronized(Integer)i){}话说这样做是正常套路么。。有什么问题么??

解决方案 »

  1.   

    synchronized关键字使用说明synchronized只能标记非抽象的方法,不能标识成员变量。你这样写是没有语法错误的,但没有的意义,synchronized语句计算一个对象引用,试图对该对象完成锁操作, 并且在完成锁操作前停止处理。当锁操作完成synchronized语句体得到执行。当语句体执行完毕(无论正常或异常),解锁操作自动完成。补充一点:synchronized 后面可以是类。枚举,和接口
      

  2.   

    将得到的对象变量值赋值给Integer,会new Integer(i)再次开辟空间。分配了不同的内存空间。
      

  3.   


    同步块,示例代码如下: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行操作码。这是网上找的
      

  4.   

    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++;
    } }
    }
    }运行结果如下:####################################
    ta  0
    ####################################
    ####################################
    ta  1
    ####################################
    ####################################
    ta  2
    ####################################
    ####################################
    ta  3
    ####################################
    ####################################
    ta  4
    ####################################
    ####################################
    ta  5
    ####################################
    ####################################
    tb  6
    ####################################
    ####################################
    tb  7
    ####################################
    ####################################
    tb  8
    ####################################
    ####################################
    tb  9
    ####################################
    ####################################
    tb  10
    ####################################
    ####################################
    tb  11
    ####################################
    证明是可以的