- 静态方法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方法完毕!"); }
此时我们再次运行控制台输出表明符合我们的规则,并发问题解决。
总结:这里是对方法加锁[静态方法],解决了并发安全问题。