public class ThreadDemo {
- y7 }" a3 r+ C, P& X. l , ~0 L4 i( L, B6 } J5 J1 x0 h
/**2 w: v; a* O! K. N3 {! b5 G+ F) G
7 ~% S# ] g: b; H# E8 c( F, A. V8 P
* @param args# q0 N+ M5 ?$ v' }6 N
: J9 s# Y0 \- P9 _( q$ [
* @throws InterruptedException1 Z4 K: I- V3 y7 U' U
2 d" i. x( D/ X */7 t$ ]4 h) n8 P" L. v! r1 W1 C
6 E1 F2 X; J# ~/ w9 J# o8 V
public static void main(String[] args) throws InterruptedException {
- p5 f! G6 ?2 G: C5 N. G 6 n' N, M9 y7 I, g6 P9 V
for (int i = 0; i 《 10; ++i) {
3 ]- L% g! G# J! x! U / m7 y* t) Z$ D5 R) G B# U
new Thread(new MyThread(i))。start();# e) ?! x6 |9 U; q4 F
# D% h0 T8 D. j) m. | Thread.sleep(1);
5 {; N( ^8 ?) {8 f5 P+ R6 @6 h
: {( j* t, W- }) t3 V" D) L3 j }: H8 h8 g% ^5 m; u' U
7 x9 }5 @; A0 _" V: j& P; k% `
}
+ n2 |! {6 B4 e& Q, g
4 w, t/ p4 w. ~: Z/ | }/ z }- i$ V2 n% B3 p$ l( e, t4 A6 r
& r- ^5 e( G! Z, l6 k4 r$ L 从上述代码段可以得知,要想实现线程的同步,则这些线程必需去竞争一个独一的共享的对象锁。+ u2 X) q8 o' K: G: G
- {, V" u' d2 s g8 P: F7 P
基于这种思惟,我们将第一段代码改削如下所示,在建树启动线程之前,先建树一个线程之间竞争使用的Object对象,然后将这个Object对象的引用传递给每一个线程对象的lock成员变量。这样一来,每个线程的lock成员都指向统一个Object对象。我们在run体例中,对lock对象使用synchronzied块进行局部封锁,这样就可以让线程去竞争这个独一的共享的对象锁,从而实现同步。
6 a2 R* q7 M3 v7 D
2 ]: r. R1 {$ `/ t, d u2 m7 `" h; Q 代码
# O& v# L: Y" `% x v! O
, j9 ^1 K! _2 _8 F6 k package com.vista;7 k. `3 ?9 i5 n9 y/ m( W
# n1 r0 q/ x6 ]" H# M- b5 m- A
class MyThread implements java.lang.Runnable {; G3 o/ R: k& o J
. P2 s" |9 T+ L5 P4 |
private int threadId;
8 g. a; d4 ~. ^% [9 }; j2 J1 t9 q) E
: L3 I' H+ w$ z! F3 v- x private Object lock;' \" y, k; k5 b0 m: F. y
: y X; K3 e' Y% J* A( Q3 y0 n public MyThread(int id, Object obj) {2 ?0 b# ~' ~# k( D; a. h
$ U5 l6 W& ?# z% b% t
this.threadId = id;6 `4 i2 E) x( K' u( V) ~
* h/ \0 a' O+ L
this.lock = obj;
, q: v; e# \% K9 P+ q7 h . K1 A q+ o. W. G1 t4 m& E+ u2 _
} |