马士兵并发编程学习笔记

梦想与她 提交于 2020-11-03 16:29:30

<div class="htmledit_views"> <span></span><div><br></div><div><span style="font-size:18pt;">(一)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo01 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>private int</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10</span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>private</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Object</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>object</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Object();</span></span></div><div><span style="color:rgb(128,128,0);font-family:Monaco;"><span style="font-size:18pt;">@Test</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>object</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">) {</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//任何线程要执行下面的代码,必须先拿到object对象的锁</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">--;</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName() +</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>" count = "</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo01 demo01=</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo01();</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(()-&gt;</span><span style="color:rgb(102,14,122);font-family:Monaco;">demo01</span><span style="font-family:Monaco;color:rgb(51,51,51);">.test()).start();</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(()-&gt;</span><span style="color:rgb(102,14,122);font-family:Monaco;">demo01</span><span style="font-family:Monaco;color:rgb(51,51,51);">.test()).start();</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="color:rgb(0,0,0);font-family:'仿宋';font-size:18pt;">1.synchronized关键字锁定的是对象不是代码块,demo中锁的是object对象的实例(堆内存中)</span></div><div><span style="color:rgb(0,0,0);font-family:'仿宋';font-size:18pt;">2.锁定的对象有两种情况:①类的实例 ②类的字节码(.class)</span></div><div><span style="font-family:'仿宋';font-size:18pt;">3.关于线程安全:加synchronized关键字之后不一定能实现线程安全,具体还要看</span></div><div><span style="font-family:'仿宋';font-size:18pt;">锁定的对象是否唯一。</span></div><div><span style="font-family:'仿宋';font-size:18pt;">(二)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo02 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>private int</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10</span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="color:rgb(128,128,0);font-family:Monaco;"><span style="font-size:18pt;">@Test</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>this</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">) {</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//任何线程要执行下面的代码,必须先拿到Demo02对象实例的锁</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">--;</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName() +</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>" count = "</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="font-family:'仿宋';font-size:18pt;">1.synchronized(this)锁定的是当前类的实例,demo中锁定的是Demo02类的实例</span></div><div><span style="font-family:'仿宋';font-size:18pt;">2.此demo中如果Demo02类是单例的话可以保证在多线程访问时是线程安全的,</span></div><div><span style="font-family:'仿宋';font-size:18pt;">如果存在有多个Demo02的实例的话在多线程中不能保证线程安全,因为方法中的锁不唯一了。(堆内存中的地址不一样)</span></div><div><span style="font-family:'仿宋';font-size:18pt;">(三)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo03 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>private int</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10</span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public synchronized void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test(){</span><span style="color:rgb(128,128,128);font-family:Monaco;"><em>//等同于synchronized(this),锁定的是Demo03对象的实例</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">--;</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName() +</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>" count ="</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="color:rgb(0,0,0);font-family:'宋体';font-size:18pt;">1.synchronized关键字修饰普通方法等同于synchronized(this)</span></div><div><span style="color:rgb(0,0,0);font-family:'宋体';font-size:18pt;">(四)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="color:rgb(0,0,0);font-family:'宋体';"><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo04 {</span></span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>private static int</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><em>count</em></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10</span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public synchronized static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test1(){</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//这里等同于synchronized(Demo04.class)</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><em>count</em></span> <span style="font-family:Monaco;color:rgb(51,51,51);">--;</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName() +</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>" count = "</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><em>count</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test2(){</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//考虑一下这里写synchronize(this)是否可以</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(Demo04.</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>class</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><em>count</em></span> <span style="font-family:Monaco;color:rgb(51,51,51);">--;</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="color:rgb(0,0,0);font-family:'宋体';font-size:18pt;">1.synchronize关键字修饰静态方法锁定的是类的.class文件</span></div><div><span style="font-family:'宋体';font-size:18pt;">2.静态方法中synchronize锁定代码块,锁定的对象不能是类的实例,只能是类的.class文件。</span></div><div><span style="font-family:'宋体';font-size:18pt;">原理如同在静态方法中不能直接调用非静态方法</span></div><div><span style="font-family:'宋体';font-size:18pt;">3.类的.class文件是唯一的,所以说synchronize修饰静态方法或者锁定的对象是类的.class文件的时候</span></div><div><span style="font-family:'宋体';font-size:18pt;">在多线程中是可以实现线程安全的</span></div><div><span style="font-size:18pt;">(五)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo05</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>implements</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Runnable{</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>private int</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10</span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="color:rgb(128,128,0);font-family:Monaco;"><span style="font-size:18pt;">@Override</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public</strong></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>/* synchronized*/</em></span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">run(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">--;</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName() +</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>" count = "</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo05 demo05 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo05();</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>for</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">i =</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i &lt;</span> <span style="color:rgb(0,0,255);font-family:Monaco;">5</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i++) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(demo05,</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"THREAD"</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+ i).start();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="font-size:18pt;">1.run()方法没加synchronized关键字时,多个线程同时访问count,线程是不安全的</span></div><div><span style="font-size:18pt;">2.run()方法加上synchronized关键字后,锁定的是Demo05对象的实例,因为只创建了</span></div><div><span style="font-size:18pt;">一个Demo05的实例,多个线程访问时都要拿到Demo05的锁标记才能执行,在多个线程同时访问时也是线程安全的</span></div><div><span style="font-size:18pt;">(六)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo06</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>implements</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Runnable{</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>private int</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10</span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="color:rgb(128,128,0);font-family:Monaco;"><span style="font-size:18pt;">@Override</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public synchronized void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">run() {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">--;</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName() +</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>" count = "</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>for</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">i =</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i &lt;</span> <span style="color:rgb(0,0,255);font-family:Monaco;">5</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i++) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo06 demo06 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo06();</span><span style="color:rgb(128,128,128);font-family:Monaco;"><em>//注意这里</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(demo06,</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"THREAD"</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+ i).start();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="font-size:18pt;">1.执行可以知道,demo中虽然加上了synchronized关键字来修饰方法,但是线程是不安全的。为什么呢??</span></div><div><span style="font-size:18pt;">分析一下:synchronized修饰的是普通方法,锁定的是Demo06实例,从Main方法中可以看到,在for循环中</span></div><div><span style="font-size:18pt;">创建了多个Demo06的实例,也就是说每个线程对应都拿到各自的锁标记,可以同时执行。</span></div><div><span style="font-size:18pt;">例子:</span></div><div><span style="font-size:18pt;">多人同时上厕所,厕所门只有一把锁的时候是一个人上完之后把钥匙(锁标记)给到下一个人才可以开门上厕所</span></div><div><span style="font-size:18pt;">如果厕所门的锁有多个钥匙的情况下,就是每个人都有锁的钥匙了,大家可以一起去打开门来上厕所。(归根结底还是堆内存上的地址)</span></div><div><span style="font-size:18pt;">demo中就如同厕所门的锁有多把钥匙(锁标记),不能实现线程安全</span></div><div><span style="font-size:18pt;">(七)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo07 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public synchronized void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test1(){</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName() +</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>" test1 start.........."</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>sleep</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,255);font-family:Monaco;">10</span> <span style="font-family:Monaco;color:rgb(51,51,51);">*</span> <span style="color:rgb(0,0,255);font-family:Monaco;">1000</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName() +</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>" test1 end........"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test2(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>sleep</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,255);font-family:Monaco;">5</span> <span style="font-family:Monaco;color:rgb(51,51,51);">*</span> <span style="color:rgb(0,0,255);font-family:Monaco;">1000</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName() +</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"test2 execute......"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo07 demo07 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo07();</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(demo07 :: test1,</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"t1"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">).start();</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//JDK1.8新特性</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(demo07 :: test2,</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"t2"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">).start();</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//JDK1.8新特性</em></span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;">运行结果:</span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">t1 test1 start..........</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">t2test2 execute......</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">t1 test1 end........</span></span></div></div><div><span style="color:rgb(0,0,0);font-family:'宋体';font-size:18pt;">1.同步方法和非同步方法是可以同时调用的</span></div><div><span style="font-size:18pt;">(八)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>package</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">thread.demo_008;</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>import</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">java.util.concurrent.TimeUnit;</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">/**</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 对业务写方法加锁</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 对业务读方法不加锁</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 容易产生脏读问题</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>*</em></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em>@author</em></strong></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>Jcon</em></span></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*/</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo08 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">String</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>name</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>double</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>balance</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public synchronized void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">set(String name,</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>double</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">balance){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>this</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>name</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">= name;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>sleep</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,255);font-family:Monaco;">2</span> <span style="font-family:Monaco;color:rgb(51,51,51);">*</span> <span style="color:rgb(0,0,255);font-family:Monaco;">1000</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>this</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>balance</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">= balance;</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public synchronized double</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">getBalance(String name){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>return this</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>balance</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo08 demo08 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo08();</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(()-&gt;</span><span style="color:rgb(102,14,122);font-family:Monaco;">demo08</span><span style="font-family:Monaco;color:rgb(51,51,51);">.set(</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"zhangsan"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">,</span><span style="color:rgb(0,0,255);font-family:Monaco;">100.0</span><span style="font-family:Monaco;color:rgb(51,51,51);">)).start();</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//JDK1.8新特性</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">1</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(demo08.getBalance(</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"zhangsan"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">));</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">2</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(demo08.getBalance(</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"zhangsan"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">));</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><br></div><div><span style="color:rgb(0,0,0);font-family:'宋体';font-size:18pt;">2.对业务写方法加锁,同时也要对业务读方法加锁,否则容易产生脏读问题</span></div><div><span style="font-size:18pt;">(九)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">/**</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 一个同步方法可以调用另一个同步方法,一个线程已经拥有某个对象的锁,再次申请的时候</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 仍然会得到该对象的锁</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 也就是说synchronized获得的锁是可重入的</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>*</em></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em>@author</em></strong></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>Jcon</em></span></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*/</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo09 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test1(){</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"test1 start........."</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">1</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">test2();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test2(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">2</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"test2 start......."</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo09 demo09 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo09();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">demo09.test1();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="font-size:18pt;">1.一个同步方法可以调用另一个同步方法,一个线程已经拥有某个对象的锁,</span></div><div><span style="font-size:18pt;">再次申请的时候仍然会得到该对象的锁</span></div><div><span style="font-size:18pt;">也就是说synchronized获得的锁是可重入的</span></div><div><span style="font-size:18pt;">(十)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>package</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">thread.demo_010;</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>import</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">java.util.concurrent.TimeUnit;</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">/**</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 再次申请的时候仍然会得到该对象的锁,也就是说synchronize获得的锁是可重入的</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 这里是继承中有可能发生的情形,子类调用父类的同步方法</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>*</em></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em>@author</em></strong></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>Jcon</em></span></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*/</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo10 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test(){</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"test start........"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">1</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"test end........"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo100().test();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo100</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>extends</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo10{</span></span></div><div><span style="color:rgb(128,128,0);font-family:Monaco;"><span style="font-size:18pt;">@Override</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test() {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"child test start......."</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>super</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.test();</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"child test end......."</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="font-size:18pt;">2.一个同步方法可以调用另一个同步方法,一个线程已经拥有某个对象的锁,</span></div><div><span style="font-size:18pt;">再次申请的时候仍然会得到该对象的锁</span></div><div><span style="font-size:18pt;">也就是说synchronized获得的锁是可重入的(</span><span style="font-size:18pt;color:rgb(128,128,128);font-family:Monaco;"><em>这里是继承中有可能发生的情形,子类调用父类的同步方法</em></span><span style="font-size:18pt;">)</span></div><div><br></div><div><span style="font-size:18pt;">(十一)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">/**</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 程序在执行过程中,如果出现异常,默认情况锁会被释放</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 所以,在并发处理的过程中,有异常要多加小心,不然可能会发生不一致的情况</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 比如,在一个web app处理过程中,多个servlet线程共同访问通一个资源,这是如果异常处理不合适</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 在第一个线程中抛出异常,其他线程就会进入同步代码去,有可能访问到异常产生是的数据</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 因此要非常小心的处理同步业务逻辑中的异常</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>*</em></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em>@author</em></strong></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>Jcon</em></span></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*/</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo11 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test(){</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName() +</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>" start......"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>while</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>true</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">++;</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName() +</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>" count = "</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">1</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>if</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">==</span> <span style="color:rgb(0,0,255);font-family:Monaco;">5</span><span style="font-family:Monaco;color:rgb(51,51,51);">) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">i =</span> <span style="color:rgb(0,0,255);font-family:Monaco;">1</span><span style="font-family:Monaco;color:rgb(51,51,51);">/</span><span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//此处抛出异常,锁将被释放,要想不被释放,可以在这里进行catch处理,然后让循环继续</em></span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo11 demo11 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo11();</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Runnable r =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Runnable() {</span></span></div><div><span style="color:rgb(128,128,0);font-family:Monaco;"><span style="font-size:18pt;">@Override</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">run() {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;">demo11</span><span style="font-family:Monaco;color:rgb(51,51,51);">.test();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">};</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(r,</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"t1"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">).start();</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">1</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(r,</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"t2"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">).start();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="color:rgb(0,0,0);font-family:'宋体';font-size:18pt;">1.程序在执行过程中,如果出现异常,默认情况锁会被释放</span></div><div><span style="font-size:18pt;">(十二)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo12 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>volatile boolean</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>running</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>true</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test(){</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"test start......."</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>while</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>running</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">) {</span></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">/*try {</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">TimeUnit.SECONDS.sleep(10);</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">} catch (InterruptedException e) {</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">e.printStackTrace();</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">}*/</span></em></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(</span><span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"test end........"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo12 demo12 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo12();</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(demo12 :: test,</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"t1"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">).start();</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//JDK1.8新特性</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">1</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">demo12.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>running</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>false</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="font-size:18pt;">* volatile 关键字,使一个变量在多个线程间可见</span></div><div><span style="font-size:18pt;">* A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必知道</span></div><div><span style="font-size:18pt;">* 使用volatile关键字,会让所有线程都会读到变量的修改值</span></div><div><span style="font-size:18pt;">*</span></div><div><span style="font-size:18pt;">* 在下面的代码中,running是存在于堆内存的t对象中</span></div><div><span style="font-size:18pt;">* 当线程t1开始运行的时候,会把running值从内存中读到t1线程的工作区,在运行过程中直接使用这个copy,并不会每次都去</span></div><div><span style="font-size:18pt;">* 读取堆内存,这样,当主线程修改running的值之后,t1线程感知不到,所以不会停止运行</span></div><div><span style="font-size:18pt;">*</span></div><div><span style="font-size:18pt;">* 使用volatile,将会强制所有线程都去堆内存中读取running的值</span></div><div><span style="font-size:18pt;">*</span></div><div><span style="font-size:18pt;">* 可以阅读这篇文章进行更深入的理解</span></div><div><span style="font-size:18pt;">*</span> <a href="http://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html" rel="nofollow" style="font-size:18pt;" target="_blank">http://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html</a></div><div><span style="font-size:18pt;">*</span></div><div><br></div><div><span style="font-size:18pt;">(十三)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">**</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* volatile并不能保证多个线程共同修改running变量时所带来的不一致问题,</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 也就是说volatile不能替代synchronize</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 运行下面的程序,并分析结果</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>*</em></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em>@author</em></strong></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>Jcon</em></span></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*/</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo13 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>volatile int</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>for</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">i =</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i &lt;</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10000</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i++) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">++;</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo13 demo13 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo13();</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">List&lt;Thread&gt; threads =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">ArrayList&lt;Thread&gt;();</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>for</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">i =</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i &lt;</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i++) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">threads.add(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(demo13::test,</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"thread-"</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+ i));</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">threads.forEach((o)-&gt;o.start());</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//JDK1.8新特性</em></span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">threads.forEach((o)-&gt;{</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//JDK1.8新特性</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">o.join();</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//等线程执行完毕之后才执行主线程main</em></span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(Exception e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">});</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(demo13.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="font-size:18pt;">* volatile并不能保证多个线程共同修改running变量时所带来的不一致问题,也就是说volatile不能替代synchronized</span></div><div><span style="font-size:18pt;">(十四)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo14 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public synchronized void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>for</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">i =</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i &lt;</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10000</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i++) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">++;</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo14 demo14 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo14();</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">List&lt;Thread&gt; threads =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">ArrayList&lt;Thread&gt;();</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>for</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">i =</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i &lt;</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i++) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">threads.add(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(demo14::test,</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"thread-"</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+ i));</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">threads.forEach((o)-&gt;o.start());</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//JDK1.8新特性</em></span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">threads.forEach((o)-&gt;{</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//JDK1.8新特性</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">o.join();</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//等线程执行完毕之后才执行主线程main</em></span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(Exception e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">});</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(demo14.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><br></div><div><span style="color:rgb(0,0,0);font-family:'宋体';font-size:18pt;">* 对比上一个程序,可以用synchronized解决,synchronize可以保证可见性和原子性,volatile只能保证可见性</span></div><div><span style="font-size:18pt;">(十五)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo15 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>//int count = 0;</em></span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">AtomicInteger</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">AtomicInteger(</span><span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public</strong></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>/*synchronized*/</em></span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>for</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">i =</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i &lt;</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10000</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i++) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>//count ++;</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.incrementAndGet();</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//count++</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>// 注意下面则不构成原子性,因为在get时,线程a进行判断后,但是不执行下面代码</em></span></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">// 线程b进行判断,执行完代码,此时代码是1000,然后线程a执行,此时结果是1001</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">// if (count.get() &gt; 1000) {</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">// count.incrementAndGet();</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">// }</span></em></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo15 demo15 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo15();</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">List&lt;Thread&gt; threads =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">ArrayList&lt;Thread&gt;();</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>for</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">i =</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i &lt;</span> <span style="color:rgb(0,0,255);font-family:Monaco;">10</span><span style="font-family:Monaco;color:rgb(51,51,51);">; i++) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">threads.add(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(demo15::test,</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"thread-"</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">+ i));</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">threads.forEach((o)-&gt;o.start());</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//JDK1.8新特性</em></span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">threads.forEach((o)-&gt;{</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//JDK1.8新特性</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">o.join();</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//等线程执行完毕之后才执行主线程main</em></span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(Exception e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">});</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(demo15.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="font-size:18pt;">* 解决同样的问题的更高效的方法,使用AtomXXX类</span></div><div><span style="font-size:18pt;">* AtomXXX类本身方法都是原子性的,但不能保证多个方法连续调用是原子性</span></div><div><span style="font-size:18pt;">(十六)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">/**</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* synchronize优化</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 同步代码快中的语句越少越好</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 比较test1和test2</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>*</em></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em>@author</em></strong></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>Jcon</em></span></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*/</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo16 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>int</strong></span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,255);font-family:Monaco;">0</span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public synchronized void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test1(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">2</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>//业务逻辑中只有下面这句需要sync,这时不应该给整个方法上锁</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">++;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">2</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test2(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">2</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>//业务逻辑中只有下面这句需要sync,这时不应该给整个方法上锁</em></span></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">//采用细粒度的锁,可以是线程争用时间变短,从而提高效率</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>this</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>count</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">++;</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">2</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="font-size:18pt;">1.业务逻辑中只有下面这句需要sync,这时不应该给整个方法上锁</span></div><div><span style="font-size:18pt;">2.采用细粒度的锁,可以是线程争用时间变短,从而提高效率</span></div><div><span style="font-size:18pt;">(十七)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">/**</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 锁定某对象o,如果o的属性发生改变,不影响锁的使用</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 但是如果o变成另外一个对象,则锁定的对象发生改变</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">* 应该避免将锁定对象的引用变成另外一个对象</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>*</em></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em>@author</em></strong></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>Jcon</em></span></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*</span></em></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><em><span style="font-size:18pt;">*/</span></em></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo17 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Object</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>o</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Object();</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>o</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>while</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>true</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">) {</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">1</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">System.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>out</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.println(Thread.</span><span style="font-family:Monaco;color:rgb(51,51,51);"><em>currentThread</em></span><span style="font-family:Monaco;color:rgb(51,51,51);">().getName());</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public static void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">main(String[] args) {</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Demo17 demo17 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo17();</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>//启动第一个线程</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(demo17 :: test,</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"t1"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">).start();</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//JDK1.8新特性</em></span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>try</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">{</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">TimeUnit.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong><em>SECONDS</em></strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">.sleep(</span><span style="color:rgb(0,0,255);font-family:Monaco;">3</span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">}</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>catch</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(InterruptedException e) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">e.printStackTrace();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><em>//启动第二个线程</em></span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">Thread t2 =</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Thread(demo17 :: test,</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"t2"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">);</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">demo17.</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>o</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,0,128);font-family:Monaco;"><strong>new</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Object();</span> <span style="color:rgb(128,128,128);font-family:Monaco;"><em>//锁对象发生改变,所以t2线程得以执行,如果注释掉这句话,线程t2将永远得不到执行机会</em></span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">t2.start();</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="font-size:18pt;">* 锁定某对象o,如果o的属性发生改变,不影响锁的使用</span></div><div><span style="font-size:18pt;">* 但是如果o变成另外一个对象,则锁定的对象发生改变</span></div><div><span style="font-size:18pt;">* 应该避免将锁定对象的引用变成另外一个对象</span></div><div><span style="font-size:18pt;">(十八)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em><span style="font-size:18pt;">/**</span></em></strong></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em><span style="font-size:18pt;">* 不要以字符串常量作为锁定的对象</span></em></strong></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em><span style="font-size:18pt;">* 在下面的例子中,test1和test2其实锁定的是同一个对象</span></em></strong></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em><span style="font-size:18pt;">* 这种情况还会发生比较诡异的现象,比如你用到了一个类库,在该类库中代码锁定了字符串"hello",</span></em></strong></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em><span style="font-size:18pt;">* 但是你读不到源码,所以你在自己的代码中也锁定了"hello",这时候就有可能发生非常诡异的死锁阻塞,</span></em></strong></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em><span style="font-size:18pt;">* 因为你的程序和你用的的类库不经意间使用了同一把锁</span></em></strong></span></div><div><span style="font-size:18pt;"><span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em>*</em></strong></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em>@author</em></strong></span> <span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em>Jcon</em></strong></span></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em><span style="font-size:18pt;">*</span></em></strong></span></div><div><span style="color:rgb(128,128,128);font-family:Monaco;"><strong><em><span style="font-size:18pt;">*/</span></em></strong></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo18 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">String</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>s1</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"hello"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="font-family:Monaco;color:rgb(51,51,51);">String</span> <span style="color:rgb(102,14,122);font-family:Monaco;"><strong>s2</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">=</span> <span style="color:rgb(0,128,0);font-family:Monaco;"><strong>"hello"</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">;</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test1(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>s1</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public void</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">test2(){</span></span></div><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>synchronized</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">(</span><span style="color:rgb(102,14,122);font-family:Monaco;"><strong>s2</strong></span><span style="font-family:Monaco;color:rgb(51,51,51);">) {</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div><div><span style="font-family:Monaco;color:rgb(51,51,51);"><span style="font-size:18pt;">}</span></span></div></div><div><span style="color:rgb(0,0,0);font-family:'宋体';font-size:18pt;">1.不要以字符串常量作为锁定的对象</span></div><div><br></div><br> </div>

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!