java多线程 -- 同步鎖
生活随笔
收集整理的這篇文章主要介紹了
java多线程 -- 同步鎖
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
為了解決多線程安全問題
在 Java 5.0 之前,協(xié)調(diào)共享對象的訪問時可以使用的機制只有 synchronized 和 volatile 。
Java 5.0 后增加了一些新的機制,但并不是一種替代內(nèi)置鎖的方法,而是當內(nèi)置鎖不適用時,作為一種可選擇的高級功能。
隱式鎖
synchronized
顯示鎖 Lock
jdk 1.5 后:同步鎖 Lock?需要通過 lock() 方法上鎖,必須通過 unlock() 方法進行釋放鎖。
ReentrantLock 實現(xiàn)了 Lock 接口,并提供了與synchronized 相同的互斥性和內(nèi)存可見性。但相較于synchronized 提供了更高的處理鎖的靈活性。
Lock使用方式:
Lock lock = new ReentrantLock(); lock.lock(); try { } finally { lock.unlock(); }相關API:
不使用鎖出現(xiàn)多線程安全問題demo:
package com.company;public class TestLock {public static void main(String[] args) {Ticket ticket = new Ticket();new Thread(ticket, "1號窗口").start();new Thread(ticket, "2號窗口").start();new Thread(ticket, "3號窗口").start();}}class Ticket implements Runnable{private int tick = 100;@Overridepublic void run() {while(true){if(tick > 0){try {Thread.sleep(200);} catch (InterruptedException e) {}System.out.println(Thread.currentThread().getName() + " 完成售票,余票為:" + --tick);}}}}看出現(xiàn)的問題(截取結(jié)果中一部分):
3號窗口 完成售票,余票為:10 1號窗口 完成售票,余票為:8 2號窗口 完成售票,余票為:8 3號窗口 完成售票,余票為:8 2號窗口 完成售票,余票為:7 1號窗口 完成售票,余票為:7 3號窗口 完成售票,余票為:7 1號窗口 完成售票,余票為:6 2號窗口 完成售票,余票為:5 3號窗口 完成售票,余票為:4 3號窗口 完成售票,余票為:3 1號窗口 完成售票,余票為:3 2號窗口 完成售票,余票為:3 3號窗口 完成售票,余票為:2 1號窗口 完成售票,余票為:0 2號窗口 完成售票,余票為:1現(xiàn)在我們用Lock來進行處理:
package com.company;import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class TestLock {public static void main(String[] args) {Ticket ticket = new Ticket();new Thread(ticket, "1號窗口").start();new Thread(ticket, "2號窗口").start();new Thread(ticket, "3號窗口").start();}}class Ticket implements Runnable {private int tick = 100;private Lock lock = new ReentrantLock();@Overridepublic void run() {while (true) {try {lock.lock();if (tick > 0) {try {Thread.sleep(200);} catch (InterruptedException e) {}System.out.println(Thread.currentThread().getName() + " 完成售票,余票為:" + --tick);}} finally { lock.unlock();}}}}看下結(jié)果(當然也是一部分),很完美解決多線程安全問題:
2號窗口 完成售票,余票為:20 2號窗口 完成售票,余票為:19 2號窗口 完成售票,余票為:18 2號窗口 完成售票,余票為:17 2號窗口 完成售票,余票為:16 2號窗口 完成售票,余票為:15 2號窗口 完成售票,余票為:14 2號窗口 完成售票,余票為:13 2號窗口 完成售票,余票為:12 2號窗口 完成售票,余票為:11 2號窗口 完成售票,余票為:10 2號窗口 完成售票,余票為:9 2號窗口 完成售票,余票為:8 2號窗口 完成售票,余票為:7 2號窗口 完成售票,余票為:6 2號窗口 完成售票,余票為:5 2號窗口 完成售票,余票為:4 2號窗口 完成售票,余票為:3 2號窗口 完成售票,余票為:2 2號窗口 完成售票,余票為:1 2號窗口 完成售票,余票為:0?
總結(jié)
以上是生活随笔為你收集整理的java多线程 -- 同步鎖的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都全域禁飞“低慢小”航空器,管控时段
- 下一篇: 快看发布126部暑期精品片单,推出漫画行