- 静态方法synchronized加锁
简要说明: 静态方法同步
* 静态方法被synchronized修饰后,一定具有同步效果.
* 静态方法的上锁对象为当前类的类对象* java中有一个名为Class的类.其每一个实例用于
* 描述java中的一个类.
* 每当我们使用一个类时,JVM在读取该类class文件
* 后都会创建一个Class的实例来保存该类的信息,
* 以便使用.所以在JVM内部,每一个类都有一个且只
* 有一个Class的实例对应.静态方法加锁就是给这个对象上锁的.
下面通过简单实例演示
案例场景:在一个线程调用某个静态方法时,不允许其他线程在调用,当调用执行完毕后才可以被其他线程调用。
没有加锁情况:
public class SyncDemo3 {
public static void main(String[] args) {
Thread t1 = new Thread(){
@Override
public void run() {
SyncDemo3.dosome();
}
};
Thread t2 = new Thread(){
@Override
public void run() {
SyncDemo3.dosome();
}
};
t1.start();
t2.start();
}
public static void dosome(){
Thread t = Thread.currentThread();
System.out.println(t.getName()+":正在执行dosome方法");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(t.getName()+"执行dosome方法完毕!");
}
}
运行程序后我们看到不符合我们设定的规则:两个线程同时调用dosome静态方法。
对于这种情况如何解决呢?对,加锁
加锁后代码如下所示:
public synchronized static void dosome(){
Thread t = Thread.currentThread();
System.out.println(t.getName()+":正在执行dosome方法");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(t.getName()+"执行dosome方法完毕!");
}
此时我们再次运行控制台输出表明符合我们的规则,并发问题解决。
总结:这里是对方法加锁[静态方法],解决了并发安全问题。