当前位置: 代码迷 >> Java相关 >> 替静态变量加锁失败
  详细解决方案

替静态变量加锁失败

热度:33   发布时间:2016-04-22 20:46:25.0
为静态变量加锁失败
两个进程访问同一个静态变量,我在第一个进程访问的时候,对静态变量加了锁,为什么第二个进程依然可以获取到这个静态变量?怎么对一个静态变量加锁?
public class SynchronizedTest2 {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new Thread21());
exec.execute(new Thread22());
exec.shutdown();
}

}

class Thread21 extends Thread{
public void run(){
System.out.println("thread21");
synchronized (SyncObject2.a) {
int a = SyncObject2.a;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
a++;
SyncObject2.a = a;
System.out.println("thread21   "+SyncObject2.a);
}

}
}
class Thread22 extends Thread{
public void run(){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread22");
SyncObject2.a = 12;
System.out.println("thread22   "+SyncObject2.a);
}
}
class SyncObject2{
public static Integer a = 0;
}

------解决思路----------------------
稍微改动了一下,看是不是你想要的

public class SynchronizedTest2 {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new Thread21());
exec.execute(new Thread21());
exec.shutdown();
}

}
class Thread21 extends Thread{
public void run(){
while(true){
synchronized (SyncObject2.class) {
int a = SyncObject2.a;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
a++;
SyncObject2.a = a;
System.out.println(Thread.currentThread().getName()+":"+SyncObject2.a);
}
}
}
}

------解决思路----------------------
楼主对加锁的理解有点误区!
 synchronized (SyncObject2.a) {
            int a = SyncObject2.a;
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            a++;
            SyncObject2.a = a;
            System.out.println("thread21   "+SyncObject2.a);
        }
这样写的意思是当一个线程执行到这个代码块就获取到了SyncObject2.a这个对象的锁!在这个线程还没有执行完的时候,如果其他线程也执行到这段代码块会检查SyncObject2.a这个对象的锁是否被其他线程取走,如果被取走,这个线程就阻塞等待实现了线程互斥。
并不是说一个代码块使用了SyncObject2.a对象作为监视器,这个监视器对象就没有办法被其他线程访问!只是那段同步的代码块不能被多个线程同时访问!
啰嗦这么多楼主能明白吗?
         
  相关解决方案