并發(fā)編程-同步與鎖

概念

在并發(fā)編程開發(fā)過程中,如果多個(gè)線程共享一塊資源,就會(huì)產(chǎn)生競爭條件,考慮安全性,需要同步機(jī)制保證代碼能夠正確執(zhí)行,保證任何時(shí)刻,只能有一個(gè)線程占有鎖和執(zhí)行同步代碼塊,沒有獲取到鎖的線程存放在等待隊(duì)列中。

實(shí)現(xiàn)方式

  • synchronized關(guān)鍵字修飾需要同步的方法和對(duì)象
  • Lock鎖機(jī)制實(shí)現(xiàn)同步
  • 原子變量實(shí)現(xiàn)同步

synchronized

可以作為修飾符,也可以作為語句,即可以同步代碼塊,也可以同步方法。但獲得的都是對(duì)象鎖,每個(gè)對(duì)象只能有一個(gè)鎖。

案例

//共享對(duì)象
public class Synch {
     int count = 0;

    public  void increse() throws InterruptedException {
        TimeUnit.MILLISECONDS.sleep(1000);
        count++;
        System.out.println(count);
    }
}
//調(diào)用
public class SynchDemo {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        Synch synch = new Synch();
        for(int i=0;i<10;i++){
            executorService.execute(()->{
                try {
                    synch.increse();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        executorService.shutdown();
    }
}


Synch類沒有加synchronized修飾時(shí),返回的結(jié)果為


A6E2E747-DD8D-4F44-B594-560D3CD365DC.png

Synch類加synchronized修飾時(shí),返回的結(jié)果為


5A443BCB-67CF-434D-8E2C-1809E22D4B04.png
public class LockSynch {

    private AtomicInteger increase = new AtomicInteger(0);

    private ReentrantLock lock = new ReentrantLock();

    public void increase()  {
        try {
            //lock.lock();
            Thread.sleep(1000);
            int number = increase.incrementAndGet();
            System.out.println(number);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            //lock.unlock();
        }

    }
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        LockSynch lockSynch = new LockSynch();
        for(int i=0;i<10;i++){
            executorService.execute(new Runnable(){
                @Override
                public void run() {
                    lockSynch.increase();
                }
            });
        }
    }
}

注:通過原子變量保證線程同步,但不保證線程的執(zhí)行順序。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容