Java多线程系列--“基础篇”04之 synchronized关键字(四)
ssloader对象上)。
关于“实例锁”和“全局锁”有一个很形象的例子:
pulbic class Something {
public synchronized void isSyncA(){}
public synchronized void isSyncB(){}
public static synchronized void cSyncA(){}
public static synchronized void cSyncB(){}
}
假设,Something有两个实例x和y。分析下面4组表达式获取的锁的情况。
(01) x.isSyncA()与x.isSyncB()
(02) x.isSyncA()与y.isSyncA()
(03) x.cSyncA()与y.cSyncB()
(04) x.isSyncA()与Something.cSyncA()
(01) 不能被同时访问。因为isSyncA()和isSyncB()都是访问同一个对象(对象x)的同步锁!
复制代码
1 // LockTest1.java的源码
2 class Something {
3 public synchronized void isSyncA(){
4 try {
5 for (int i = 0; i < 5; i++) {
6 Thread.sleep(100); // 休眠100ms
7 System.out.println(Thread.currentThread().getName()+" : isSyncA");
8 }
9 }catch (InterruptedException ie) {
10 }
11 }
12 public synchronized void isSyncB(){
13 try {
14 for (int i = 0; i < 5; i++) {
15 Thread.sleep(100); // 休眠100ms
16 System.out.println(Thread.currentThread().getName()+" : isSyncB");
17 }
18 }catch (InterruptedException ie) {
19 }
20 }
21 }
22
23 public class LockTest1 {
24
25 Something x = new Something();
26 Something y = new Something();
27
28 // 比较(01) x.isSyncA()与x.isSyncB()
29 private void test1() {
30 // 新建t11, t11会调用 x.isSyncA()
31 Thread t11 = new Thread(
32 new Runnable() {
33 @Override
34 public void run() {
35 x.isSyncA();
36 }
37 }, "t11");
38
39 // 新建t12, t12会调用 x.isSyncB()
40 Thread t12 = new Thread(
41 new Runnable() {
42 @Override
43 public void run() {
44 x.isSyncB();
45 }
46 }, "t12");
47
48
49 t11.start(); // 启动t11
50 t12.start(); // 启动t12
51 }
52
53 public static void main(String[] args) {
54 LockTest1 demo = new LockTest1();
55 demo.test1();
56 }
57 }
复制代码
运行结果:
复制代码
t11 : isSyncA
t11 : isSyncA
t11 : isSyncA
t11 : isSyncA
t11 : isSyncA
t12 : isSyncB
t12 : isSyncB
t12 : isSyncB
t12 : isSyncB
t12 : isSyncB
复制代码
(02) 可以同时被访问。因为访问的不是同一个对象的同步锁,x.isSyncA()访问的是x的同步锁,而y.isSyncA()访问的是y的同步锁。
复制代码
1 // LockTest2.java的源码
2 class Something {
3 public synchronized void isSyncA(){
4 try {
5 for (int i = 0; i < 5; i++) {
6 Thread.sleep(100); // 休眠100ms
7 System.out.println(Thread.currentThread().getName()+" : isSyncA");
8 }
9 }catch (InterruptedException ie) {
10 }
11 }
12 public synchronized void isSyncB(){
13 try {
14 for (int i = 0; i < 5; i++) {
15 Thread.sleep(100); // 休眠100ms
16 System.out.println(Thread.currentThread().getName()+" : isSyncB");
17 }
18 }catch (InterruptedException ie) {
19 }
20 }
21 public static synchronized void cSyncA(){
22 try {
23 for (int i = 0; i < 5; i++) {
24 Thread.sleep(100); // 休眠100ms
25 System.out.println(Thread.currentThread().getName()+" : cSyncA");
26 }
27 }catch (InterruptedException ie) {
28 }
29 }
30 public static synchronized voi