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 <= 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 < </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,如需轉載請自行聯系原作者