日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java多线程 -- 同步鎖

發布時間:2023/12/31 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多线程 -- 同步鎖 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為了解決多線程安全問題
在 Java 5.0 之前,協調共享對象的訪問時可以使用的機制只有 synchronized 和 volatile 。
Java 5.0 后增加了一些新的機制,但并不是一種替代內置鎖的方法,而是當內置鎖不適用時,作為一種可選擇的高級功能。

隱式鎖

synchronized

  • 同步代碼塊;
  • 同步方法。
  • 顯示鎖 Lock

    jdk 1.5 后:同步鎖 Lock?需要通過 lock() 方法上鎖,必須通過 unlock() 方法進行釋放鎖。
    ReentrantLock 實現了 Lock 接口,并提供了與synchronized 相同的互斥性和內存可見性。但相較于synchronized 提供了更高的處理鎖的靈活性。

    Lock使用方式:

    Lock lock = new ReentrantLock(); lock.lock(); try { } finally { lock.unlock(); }

    相關API:

  • void lock() 獲取鎖。
  • void lockInterruptibly() 如果當前線程未被中斷,則獲取鎖。
  • Condition newCondition() 返回綁定到此 Lock 實例的新 Condition 實例。
  • boolean tryLock() 僅在調用時鎖為空閑狀態才獲取該鎖。
  • boolean tryLock(long time, TimeUnit unit) 如果鎖在給定的等待時間內空閑,并且當前線程未被中斷,則獲取鎖。
  • void unlock()釋放鎖。
  • 不使用鎖出現多線程安全問題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);}}}}

    看出現的問題(截取結果中一部分):

    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

    現在我們用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();}}}}

    看下結果(當然也是一部分),很完美解決多線程安全問題:

    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

    ?

    總結

    以上是生活随笔為你收集整理的java多线程 -- 同步鎖的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。