天天看點

Java 同步代碼塊的疑問

ThreadTest.java:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

<code>package</code> <code>main;</code>

<code>import</code> <code>java.util.concurrent.atomic.AtomicLong;</code>

<code>import</code> <code>net.jcip.annotations.GuardedBy;</code>

<code>import</code> <code>net.jcip.annotations.ThreadSafe;</code>

<code>@ThreadSafe</code>

<code>public</code> <code>class</code> <code>ThreadTest {</code>

<code>    </code><code>private</code> <code>long</code> <code>hits1;</code>

<code>    </code><code>@GuardedBy</code><code>(</code><code>"this"</code><code>)</code>

<code>    </code><code>private</code> <code>long</code> <code>hits2;</code>

<code>    </code><code>private</code> <code>final</code> <code>AtomicLong count = </code><code>new</code> <code>AtomicLong(</code><code>0</code><code>);</code>

<code>    </code><code>public</code> <code>long</code> <code>getCounts() {</code>

<code>        </code><code>return</code> <code>count.get();</code>

<code>    </code><code>}</code>

<code>    </code><code>public</code> <code>synchronized</code> <code>long</code> <code>getHits1() {</code>

<code>        </code><code>return</code> <code>hits1;</code>

<code>    </code><code>public</code> <code>synchronized</code> <code>long</code> <code>getHits2() {</code>

<code>        </code><code>return</code> <code>hits2;</code>

<code>    </code><code>public</code> <code>synchronized</code> <code>void</code> <code>IncreaseHits1() {</code>

<code>        </code><code>++hits1;</code>

<code>    </code><code>public</code> <code>void</code> <code>service(</code><code>int</code> <code>n) </code><code>throws</code> <code>InterruptedException {</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>1</code><code>; i &lt;= n; i++) {</code>

<code>            </code><code>new</code> <code>Thread(</code><code>new</code> <code>Runnable() {</code>

<code>                </code><code>@Override</code>

<code>                </code><code>public</code> <code>void</code> <code>run() {</code>

<code>                    </code><code>// TODO Auto-generated method stub</code>

<code>                    </code><code>synchronized</code> <code>(</code><code>this</code><code>) {</code>

<code>                        </code><code>++hits2;</code>

<code>                    </code><code>}</code>

<code>                    </code><code>IncreaseHits1();</code>

<code>                    </code><code>count.incrementAndGet();</code>

<code>                </code><code>}</code>

<code>            </code><code>}).start();</code>

<code>        </code><code>}</code>

<code>        </code><code>System.err.println(</code><code>"All Threads running!"</code><code>);</code>

<code>        </code><code>Thread.currentThread().sleep(</code><code>2000</code><code>);</code>

<code>        </code><code>System.out.println(</code><code>"hits1:"</code> <code>+ getHits1() + </code><code>"   hits2:"</code> <code>+ getHits2()</code>

<code>                </code><code>+ </code><code>"   AtomicLong:"</code> <code>+ getCounts());</code>

<code>}</code>

main.java:

<code>public</code> <code>class</code> <code>main {</code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) </code><code>throws</code> <code>InterruptedException {</code>

<code>        </code><code>ThreadTest threadTest = </code><code>new</code> <code>ThreadTest();</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; </code><code>1000</code><code>; i++) {</code>

<code>            </code><code>threadTest.service(</code><code>10000</code><code>);</code>

請問,hits2是否最後的結果是否正确,是否線程安全?

當累計跑了185次service後,控制台輸出為:

<code>synchronized</code> <code>(</code><code>this</code><code>) {</code>

<code>    </code><code>++hits2;</code>

看輸出結果的話,上面這這一小段同步塊代碼貌似并非是線程安全的。不了解java注解有什麼作用如@ThreadSafe和@GuardedBy("this"),應該不會對運作結果造成什麼影響吧。

本文轉自 ponpon_ 51CTO部落格,原文連結:http://blog.51cto.com/liuxp0827/1415563,如需轉載請自行聯系原作者