Java开发基础-线程-线程并发安全—08

  1. 静态方法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方法完毕!");
	}

此时我们再次运行控制台输出表明符合我们的规则,并发问题解决。

总结:这里是对方法加锁[静态方法],解决了并发安全问题。

猜你喜欢

转载自blog.csdn.net/coder_boy_/article/details/80377729