Java多线程系列--“基础篇”04之 synchronized关键字(五)

2014-11-24 03:24:23 · 作者: · 浏览: 6
d cSyncB(){
31 try {
32 for (int i = 0; i < 5; i++) {
33 Thread.sleep(100); // 休眠100ms
34 System.out.println(Thread.currentThread().getName()+" : cSyncB");
35 }
36 }catch (InterruptedException ie) {
37 }
38 }
39 }
40
41 public class LockTest2 {
42
43 Something x = new Something();
44 Something y = new Something();
45
46 // 比较(02) x.isSyncA()与y.isSyncA()
47 private void test2() {
48 // 新建t21, t21会调用 x.isSyncA()
49 Thread t21 = new Thread(
50 new Runnable() {
51 @Override
52 public void run() {
53 x.isSyncA();
54 }
55 }, "t21");
56
57 // 新建t22, t22会调用 x.isSyncB()
58 Thread t22 = new Thread(
59 new Runnable() {
60 @Override
61 public void run() {
62 y.isSyncA();
63 }
64 }, "t22");
65
66
67 t21.start(); // 启动t21
68 t22.start(); // 启动t22
69 }
70
71 public static void main(String[] args) {
72 LockTest2 demo = new LockTest2();
73
74 demo.test2();
75 }
76 }
复制代码
运行结果:
复制代码
t21 : isSyncA
t22 : isSyncA
t21 : isSyncA
t22 : isSyncA
t21 : isSyncA
t22 : isSyncA
t21 : isSyncA
t22 : isSyncA
t21 : isSyncA
t22 : isSyncA
复制代码
(03) 不能被同时访问。因为cSyncA()和cSyncB()都是static类型,x.cSyncA()相当于Something.isSyncA(),y.cSyncB()相当于Something.isSyncB(),因此它们共用一个同步锁,不能被同时反问。
复制代码
1 // LockTest3.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 void cSyncB(){
31 try {
32 for (int i = 0; i < 5; i++) {
33 Thread.sleep(100); // 休眠100ms
34 System.out.println(Thread.currentThread().getName()+" : cSyncB");
35 }
36 }catch (InterruptedException ie) {
37 }
38 }
39 }
40
41 public class LockTest3 {
42
43 Something x = new Something();
44 Something y = new Something();
45
46 // 比较(03) x.cSyncA()与y.cSyncB()
47 private void test3() {
48 // 新建t31, t31会调用 x.isSyncA()
49 Thread t31 = new Thread(
50 new Runnable() {
51 @Override
52 public void run() {
53 x.cSyncA();
54 }
55 }, "t31");
56
57 // 新建t32, t32会调用 x.isSyncB()
58 Thread t32 = new Thread(
59 new Runnable() {
60 @Override
61