昆明java培训
达内昆明广州春城路

18487146383

热门课程

Java synchronized静态方法使用synchronized加锁

  • 时间:2016-10-07
  • 发布:昆明Java培训
  • 来源:达内新闻

昆明达内Java培训的老师上一期讲了Java synchronized实例方法使用synchronized加锁,这一期给同学们讲Java synchronized静态方法使用synchronized加锁。

二、静态方法中使用synchronized加锁

静态方法中默认被加锁的对象是此静态方法所在类的class对象。

1 class staticMethodSynchronized {

2    public static synchronized void method1() throws InterruptedException {

3        System.out.println(Thread.currentThread().getName() + ": start");

4        Thread.sleep(5000);

5        System.out.println(Thread.currentThread().getName() + ": finish");

6    }

7    public static synchronized void method2() throws InterruptedException {

8        System.out.println(Thread.currentThread().getName() + ": start");

9        Thread.sleep(5000);

10        System.out.println(Thread.currentThread().getName() + ": finish");

11    }

12 }

13 public class TestStaticClassSynchronized {

14    public static void main(String[] args) {

15        Thread t1 = new Thread(new Runnable() {

16

17            @Override

18            public void run() {

19                // TODO Auto-generated method stub

20                try {

21                    staticMethodSynchronized.method1();

22                } catch (InterruptedException e) {

23                    // TODO Auto-generated catch block

24                    e.printStackTrace();

25                }

26            }

27            

28        }, "t1");

29        Thread t2 = new Thread(new Runnable() {

30

31            @Override

32            public void run() {

33                // TODO Auto-generated method stub

34                try {

35                    staticMethodSynchronized.method2();

36                } catch (InterruptedException e) {

37                    // TODO Auto-generated catch block

38                    e.printStackTrace();

39                }

40            }

41            

42        }, "t2");

43        t1.start();

44        t2.start();

45    }

46 }

在上述代码中创建了两个线程并命名为t1,t2。t1,t2线程调用了staticMethodSynchronized类的两个静态同步方法method1和method2。

在t1线程开始执行后,即使t1线程睡眠了5s,线程t2中的method2方法仍然没有得到执行。这是因为t1线程先执行的method1方法,持有了staticMethodSynchronized类对象的锁,且method1方法并没有执行完,staticMethodSynchronized类对象的锁没有被释放,所以comeInIn方法无法对staticMethodSynchronized类对象加锁,就无法继续执行,只能等到t1线程中的method1方法执行完毕,释放staticMethodSynchronized类对象的锁,method2方法才能继续执行。

了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

上一篇:Java synchronized实例方法使用synchronized加锁
下一篇:实例方法中使用synchronized关键字制造同步块

达内培训小米MIX 2尊享版工艺精湛

程序猿教你java的创建和销毁对象

昆明java培训-程序猿带你入门到精通

昆明达内-有趣的轻量级图像浏览器

选择城市和中心
贵州省

广西省

海南省