赞
踩
昆明达内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)!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。