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

18487146383

热门课程

静态方法中使用synchronized关键字制造同步块

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

昆明Java培训机构的老师给大家讲静态方法中使用synchronized关键字制造同步块

同步块中默认被加锁的对象是此同步块括号声明中包含的对象。

1 class staticMethodSynchronized {

2    private static final Object OBJ = new Object();

3    public static void method1() throws InterruptedException {

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

5        synchronized(OBJ) {

6            System.out.println(Thread.currentThread().getName() + ":获得锁");

7            System.out.println(Thread.currentThread().getName() + ":释放锁");

8        }

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

10    }

11    public static void method2() throws InterruptedException {

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

13        synchronized(OBJ) {

14            System.out.println(Thread.currentThread().getName() + ":获得锁");

15            System.out.println(Thread.currentThread().getName() + ":释放锁");

16        }

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

18    }

19 }

20 public class TestStaticClassSynchronized {

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

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

23

24            @Override

25            public void run() {

26                // TODO Auto-generated method stub

27                try {

28                    staticMethodSynchronized.method1();

29                } catch (InterruptedException e) {

30                    // TODO Auto-generated catch block

31                    e.printStackTrace();

32                }

33            }

34            

35        }, "t1");

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

37

38            @Override

39            public void run() {

40                // TODO Auto-generated method stub

41                try {

42                    staticMethodSynchronized.method2();

43                } catch (InterruptedException e) {

44                    // TODO Auto-generated catch block

45                    e.printStackTrace();

46                }

47            }

48            

49        }, "t2");

50        t1.start();

51        t2.start();

52    }

53 }

在上述代码中,两个静态方法中的同步块都要获得对象OBJ的锁才能继续向下执行。

若t1线程先获得锁,则必须等到t1释放锁之后,t2线程中同步代码块及其之后的代码才能继续执行,t2线程先获得锁,t1线程同理。

总之,昆明Java培训机构的老师认为我们只需抓住一点:Java中每个实例对象对应一把锁且每个实例对象只有一把锁,synchronized关键字是通过对相应的实例对象加锁来实现同步功能的(静态方法为对相应的class对象加锁)。在执行synchronized方法或synchronized同步块之前,我们只需判断其需要获得的对象的锁是否可获得,就可判断此方法或同步块是否可得到执行。

上一篇:实例方法中使用synchronized关键字制造同步块
下一篇:java程序员:isEmpty与null、""的区别

昆明java培训机构:java未来的发展走向

昆明java培训机构:java学完可以干什么!

昆明java培训机构:如何搞定BAT和华为offer?有这份攻略就够了!

昆明java培训机构:学Java别担心枯燥和无聊

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货