|
4 | 4 | <title><![CDATA[Lumint's Octopress Blog]]></title>
|
5 | 5 | <link href="http://lumint.github.io/atom.xml" rel="self"/>
|
6 | 6 | <link href="http://lumint.github.io/"/>
|
7 |
| - <updated>2013-10-02T17:27:09+08:00</updated> |
| 7 | + <updated>2013-10-02T19:43:35+08:00</updated> |
8 | 8 | <id>http://lumint.github.io/</id>
|
9 | 9 | <author>
|
10 | 10 | <name><![CDATA[Lumint]]></name>
|
|
62 | 62 |
|
63 | 63 |
|
64 | 64 | <p>
|
65 |
| - 当一个线程进入critical section时,那么JVM是根据什么来判断该线程是否能进入呢?当编写程序设定critical section时,我们会为该critical section指定一个mutex(互斥量),而互斥量的值将决定 |
| 65 | + 当一个线程进入critical section时,那么JVM是根据什么来判断该线程是否能进入呢?当编写程序设定critical section时,我们会为该critical section指定一个mutex(互斥量),而互斥量的值将决定 |
66 | 66 | 其他线程是否可以进入该Critical Section.
|
67 |
| - “` Java |
68 |
| - synchronized(mutex){ |
69 |
| - … |
70 |
| - } |
71 |
| - “` |
| 67 | + |
72 | 68 |
|
73 | 69 | </p>
|
74 | 70 |
|
| 71 | +
|
| 72 | +<pre><code> synchronized(mutex){ |
| 73 | + // critical section code |
| 74 | + ... |
| 75 | + } |
| 76 | +</code></pre> |
| 77 | +
|
| 78 | +<p> |
| 79 | + 在Java使用上面语法可以设置Critical Section,对于互斥的代码可以写入Critical Section.如下面代码:<br/> |
| 80 | +</p> |
| 81 | +
|
| 82 | +
|
| 83 | +
|
| 84 | +
|
| 85 | +<figure class='code'><figcaption><span>ThreadSync1.java</span><a href='http://weibo.com/u/2277842353'>Weibo</a></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span> |
| 86 | +<span class='line-number'>2</span> |
| 87 | +<span class='line-number'>3</span> |
| 88 | +<span class='line-number'>4</span> |
| 89 | +<span class='line-number'>5</span> |
| 90 | +<span class='line-number'>6</span> |
| 91 | +<span class='line-number'>7</span> |
| 92 | +<span class='line-number'>8</span> |
| 93 | +<span class='line-number'>9</span> |
| 94 | +<span class='line-number'>10</span> |
| 95 | +<span class='line-number'>11</span> |
| 96 | +<span class='line-number'>12</span> |
| 97 | +<span class='line-number'>13</span> |
| 98 | +<span class='line-number'>14</span> |
| 99 | +<span class='line-number'>15</span> |
| 100 | +<span class='line-number'>16</span> |
| 101 | +<span class='line-number'>17</span> |
| 102 | +<span class='line-number'>18</span> |
| 103 | +<span class='line-number'>19</span> |
| 104 | +<span class='line-number'>20</span> |
| 105 | +<span class='line-number'>21</span> |
| 106 | +<span class='line-number'>22</span> |
| 107 | +<span class='line-number'>23</span> |
| 108 | +<span class='line-number'>24</span> |
| 109 | +<span class='line-number'>25</span> |
| 110 | +<span class='line-number'>26</span> |
| 111 | +<span class='line-number'>27</span> |
| 112 | +<span class='line-number'>28</span> |
| 113 | +<span class='line-number'>29</span> |
| 114 | +<span class='line-number'>30</span> |
| 115 | +<span class='line-number'>31</span> |
| 116 | +<span class='line-number'>32</span> |
| 117 | +<span class='line-number'>33</span> |
| 118 | +<span class='line-number'>34</span> |
| 119 | +<span class='line-number'>35</span> |
| 120 | +<span class='line-number'>36</span> |
| 121 | +<span class='line-number'>37</span> |
| 122 | +</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="kp">public</span> <span class="k">class</span> <span class="nc">ThreadSync1</span> <span class="n">implements</span> <span class="no">Runnable</span><span class="p">{</span> |
| 123 | +</span><span class='line'> <span class="kp">private</span> <span class="no">Object</span> <span class="n">mutex</span><span class="p">;</span> |
| 124 | +</span><span class='line'> |
| 125 | +</span><span class='line'> <span class="kp">public</span> <span class="no">ThreadSync1</span><span class="p">(</span><span class="no">Object</span> <span class="n">mutex</span><span class="p">)</span> <span class="p">{</span> |
| 126 | +</span><span class='line'> <span class="n">this</span><span class="o">.</span><span class="n">mutex</span> <span class="o">=</span> <span class="n">mutex</span><span class="p">;</span> |
| 127 | +</span><span class='line'> <span class="p">}</span> |
| 128 | +</span><span class='line'> |
| 129 | +</span><span class='line'> <span class="kp">public</span> <span class="n">static</span> <span class="n">void</span> <span class="n">main</span><span class="p">(</span><span class="nb">String</span><span class="o">[]</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span> |
| 130 | +</span><span class='line'> <span class="no">Object</span> <span class="n">mutex1</span> <span class="o">=</span> <span class="kp">new</span> <span class="no">Object</span><span class="p">();</span> |
| 131 | +</span><span class='line'> <span class="no">Object</span> <span class="n">mutex2</span> <span class="o">=</span> <span class="kp">new</span> <span class="no">Object</span><span class="p">();</span> |
| 132 | +</span><span class='line'> <span class="kp">new</span> <span class="no">Thread</span><span class="p">(</span><span class="kp">new</span> <span class="no">ThreadSync1</span><span class="p">(</span><span class="n">mutex1</span><span class="p">),</span><span class="s2">"线程一"</span><span class="p">)</span><span class="o">.</span><span class="n">start</span><span class="p">();</span> |
| 133 | +</span><span class='line'> <span class="kp">new</span> <span class="no">Thread</span><span class="p">(</span><span class="kp">new</span> <span class="no">ThreadSync1</span><span class="p">(</span><span class="n">mutex1</span><span class="p">),</span><span class="s2">"线程二"</span><span class="p">)</span><span class="o">.</span><span class="n">start</span><span class="p">();</span> |
| 134 | +</span><span class='line'> <span class="kp">new</span> <span class="no">Thread</span><span class="p">(</span><span class="kp">new</span> <span class="no">ThreadSync1</span><span class="p">(</span><span class="n">mutex1</span><span class="p">),</span><span class="s2">"线程三"</span><span class="p">)</span><span class="o">.</span><span class="n">start</span><span class="p">();</span> |
| 135 | +</span><span class='line'> <span class="kp">new</span> <span class="no">Thread</span><span class="p">(</span><span class="kp">new</span> <span class="no">ThreadSync1</span><span class="p">(</span><span class="n">mutex2</span><span class="p">),</span><span class="s2">"线程四"</span><span class="p">)</span><span class="o">.</span><span class="n">start</span><span class="p">();</span> |
| 136 | +</span><span class='line'> <span class="p">}</span> |
| 137 | +</span><span class='line'> |
| 138 | +</span><span class='line'> <span class="kp">public</span> <span class="n">void</span> <span class="n">setMutex</span><span class="p">(</span><span class="no">Object</span> <span class="n">mutex</span><span class="p">)</span> <span class="p">{</span> |
| 139 | +</span><span class='line'> <span class="n">this</span><span class="o">.</span><span class="n">mutex</span> <span class="o">=</span> <span class="n">mutex</span><span class="p">;</span> |
| 140 | +</span><span class='line'> <span class="p">}</span> |
| 141 | +</span><span class='line'> |
| 142 | +</span><span class='line'> <span class="vi">@Override</span> |
| 143 | +</span><span class='line'> <span class="kp">public</span> <span class="n">void</span> <span class="n">run</span><span class="p">()</span> <span class="p">{</span> |
| 144 | +</span><span class='line'> <span class="n">synchronized</span> <span class="p">(</span><span class="n">mutex</span><span class="p">)</span> <span class="p">{</span> |
| 145 | +</span><span class='line'> <span class="no">System</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">println</span><span class="p">(</span><span class="no">Thread</span><span class="o">.</span><span class="n">currentThread</span><span class="p">()</span><span class="o">.</span><span class="n">getName</span><span class="p">()</span> <span class="o">+</span> <span class="s2">"进入Critical Section! 等待5秒!"</span><span class="p">);</span> |
| 146 | +</span><span class='line'> <span class="n">try</span> <span class="p">{</span> |
| 147 | +</span><span class='line'> <span class="k">for</span><span class="p">(</span><span class="n">int</span> <span class="n">i</span> <span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o"><</span><span class="mi">5</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span> |
| 148 | +</span><span class='line'> <span class="no">Thread</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span> |
| 149 | +</span><span class='line'> <span class="no">System</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">println</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span> |
| 150 | +</span><span class='line'> <span class="p">}</span> |
| 151 | +</span><span class='line'> <span class="p">}</span> <span class="kp">catch</span> <span class="p">(</span><span class="no">InterruptedException</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span> |
| 152 | +</span><span class='line'> <span class="n">e</span><span class="o">.</span><span class="n">printStackTrace</span><span class="p">();</span> |
| 153 | +</span><span class='line'> <span class="p">}</span> |
| 154 | +</span><span class='line'> <span class="no">System</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">println</span><span class="p">(</span><span class="no">Thread</span><span class="o">.</span><span class="n">currentThread</span><span class="p">()</span><span class="o">.</span><span class="n">getName</span><span class="p">()</span> <span class="o">+</span> <span class="s2">"退出Critical Section! 等待5秒!"</span><span class="p">);</span> |
| 155 | +</span><span class='line'> <span class="p">}</span> |
| 156 | +</span><span class='line'> |
| 157 | +</span><span class='line'> <span class="p">}</span> |
| 158 | +</span><span class='line'> <span class="p">}</span> |
| 159 | +</span></code></pre></td></tr></table></div></figure> |
| 160 | +
|
75 | 161 | ]]></content>
|
76 | 162 | </entry>
|
77 | 163 |
|
|
0 commit comments