亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Java中實(shí)現(xiàn)可見(jiàn)性(visibility)的主要方法詳解

 更新時(shí)間:2023年08月07日 08:48:11   作者:Blue92120  
這篇文章主要介紹了在Java中實(shí)現(xiàn)可見(jiàn)性(visibility)的主要方法詳解,在Java中,使用關(guān)鍵字volatile和使用鎖(如synchronized關(guān)鍵字或 java.util.concurrent包中的鎖)來(lái)確保對(duì)共享變量的修改在多線程環(huán)境中能夠正確地被其他線程所觀察到,需要的朋友可以參考下

可見(jiàn)性 visibility

在Java中,實(shí)現(xiàn)可見(jiàn)性(visibility)的主要方法是使用關(guān)鍵字volatile和使用鎖(如synchronized關(guān)鍵字或 java.util.concurrent包中的鎖)來(lái)確保對(duì)共享變量的修改在多線程環(huán)境中能夠正確地被其他線程所觀察到。

下面詳細(xì)說(shuō)明這兩種方法,并附帶代碼演示。

1.使用volatile關(guān)鍵字:

volatile是一種輕量級(jí)的同步機(jī)制,用于告訴JVM對(duì)被修飾的變量不進(jìn)行緩存,直接從主內(nèi)存中讀取和寫(xiě)入數(shù)據(jù)。

這樣可以確保當(dāng)一個(gè)線程修改了變量的值時(shí),其他線程能夠立即看到這個(gè)變化,而不是使用緩存中的舊值。

public class VolatileVisibilityExample {
    private volatile boolean flag = false;
    public void setFlag(boolean value) {
        flag = value;
    }
    public void checkFlag() {
        while (!flag) {
            // Busy waiting until the flag becomes true
        }
        System.out.println("Flag is now true!");
    }
    public static void main(String[] args) {
        VolatileVisibilityExample example = new VolatileVisibilityExample();
        new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            example.setFlag(true);
        }).start();
        new Thread(() -> {
            example.checkFlag();
        }).start();
    }
}

在上面的例子中,我們創(chuàng)建了一個(gè)VolatileVisibilityExample類(lèi),其中的flag變量被聲明為volatile。

第一個(gè)線程在啟動(dòng)后會(huì)等待1秒鐘然后將flag設(shè)置為true,而第二個(gè)線程在flag變?yōu)閠rue之前會(huì)一直進(jìn)行忙等待(busy waiting)。

由于flag是volatile的,第二個(gè)線程能夠看到第一個(gè)線程對(duì)flag的修改,并在flag變?yōu)閠rue時(shí)結(jié)束忙等待。

2.使用鎖:

另一種實(shí)現(xiàn)可見(jiàn)性的方法是使用鎖,通過(guò)synchronized關(guān)鍵字或者java.util.concurrent包中的鎖機(jī)制來(lái)保護(hù)對(duì)共享變量的訪問(wèn)。

public class LockVisibilityExample {
    private boolean flag = false;
    private final Object lock = new Object();
    public void setFlag(boolean value) {
        synchronized (lock) {
            flag = value;
        }
    }
    public void checkFlag() {
        synchronized (lock) {
            while (!flag) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("Flag is now true!");
    }
    public static void main(String[] args) {
        LockVisibilityExample example = new LockVisibilityExample();
        new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            example.setFlag(true);
            synchronized (example.lock) {
                example.lock.notifyAll();
            }
        }).start();
        new Thread(() -> {
            example.checkFlag();
        }).start();
    }
}

在上面的例子中,我們創(chuàng)建了一個(gè)LockVisibilityExample類(lèi),其中使用了一個(gè)名為lock的對(duì)象作為鎖。

在setFlag和checkFlag方法中,我們使用synchronized關(guān)鍵字來(lái)保護(hù)對(duì)flag的訪問(wèn)。

第一個(gè)線程設(shè)置flag為true并通過(guò)synchronized塊的notifyAll()方法通知第二個(gè)線程,而第二個(gè)線程則在flag變?yōu)閠rue之前一直等待,并在被通知后結(jié)束等待。

這兩種方法都可以實(shí)現(xiàn)可見(jiàn)性,但使用volatile更為簡(jiǎn)單和輕量級(jí)。

然而,在某些情況下,使用鎖可能會(huì)更有優(yōu)勢(shì),例如需要進(jìn)行更復(fù)雜的操作或需要更精細(xì)地控制對(duì)共享資源的訪問(wèn)。

到此這篇關(guān)于在Java中實(shí)現(xiàn)可見(jiàn)性(visibility)的主要方法詳解的文章就介紹到這了,更多相關(guān)Java中實(shí)現(xiàn)可見(jiàn)性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于SpringBoot和Dify實(shí)現(xiàn)流式響應(yīng)輸出

    基于SpringBoot和Dify實(shí)現(xiàn)流式響應(yīng)輸出

    這篇文章主要為大家詳細(xì)介紹了如何基于SpringBoot和Dify實(shí)現(xiàn)流式響應(yīng)輸出效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2025-03-03
  • java中線程的sleep()方法和yield()方法的區(qū)別

    java中線程的sleep()方法和yield()方法的區(qū)別

    本文主要介紹了java中線程的sleep()方法和yield()方法的區(qū)別,Thread類(lèi)的sleep()方法使線程休眠指定時(shí)間,不釋放鎖,而yield()提示調(diào)度器當(dāng)前線程愿意讓出CPU資源,不保證立即切換線程,感興趣的可以了解一下
    2024-10-10
  • Elasticsearch?Recovery索引分片分配詳解

    Elasticsearch?Recovery索引分片分配詳解

    這篇文章主要為大家介紹了關(guān)于Elasticsearch的Recovery索引分片分配詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-04-04
  • Java多線程程序中synchronized修飾方法的使用實(shí)例

    Java多線程程序中synchronized修飾方法的使用實(shí)例

    synchronized關(guān)鍵字主要北用來(lái)進(jìn)行線程同步,這里我們主要來(lái)演示Java多線程程序中synchronized修飾方法的使用實(shí)例,需要的朋友可以參考下:
    2016-06-06
  • IDEA代碼警告(warning)整理以及解決方案

    IDEA代碼警告(warning)整理以及解決方案

    在日常開(kāi)發(fā)中,IntelliJ?IDEA會(huì)通過(guò)problems窗口和編輯窗口的黃色標(biāo)記提示警告,這些警告可能指示代碼存在潛在風(fēng)險(xiǎn)或需要優(yōu)化的空間,文章介紹了如何利用IDEA檢查代碼,以及針對(duì)常見(jiàn)警告的原因和解決辦法
    2024-10-10
  • 詳解Spring Boot Profiles 配置和使用

    詳解Spring Boot Profiles 配置和使用

    本篇文章主要介紹了詳解Spring Boot Profiles 配置和使用,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-06-06
  • java正則表達(dá)式獲取url的host示例

    java正則表達(dá)式獲取url的host示例

    使用httpclient抓取頁(yè)面信息時(shí)需要填寫(xiě)HOST,使用此正則提取抓取URL的HOST內(nèi)容
    2014-02-02
  • Spring容器注入bean的幾種方式詳解

    Spring容器注入bean的幾種方式詳解

    這篇文章主要介紹了Spring容器注入bean的幾種方式詳解,@Configuration用來(lái)聲明一個(gè)配置類(lèi),然后使用 @Bean 注解,用于聲明一個(gè)bean,將其加入到Spring容器中,這種方式是我們最常用的一種,需要的朋友可以參考下
    2024-01-01
  • SpringBoot對(duì)接clerk實(shí)現(xiàn)用戶信息獲取功能

    SpringBoot對(duì)接clerk實(shí)現(xiàn)用戶信息獲取功能

    Clerk是一個(gè)提供身份驗(yàn)證和用戶管理的服務(wù),可以幫助開(kāi)發(fā)者快速集成這些功能,下面我們就來(lái)看看如何使用Spring?Boot對(duì)接Clerk實(shí)現(xiàn)用戶信息的獲取吧
    2025-02-02
  • Springboot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)管理的示例代碼

    Springboot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)管理的示例代碼

    最近在做spring boot項(xiàng)目開(kāi)發(fā)中,由于使用@EnableScheduling注解和@Scheduled注解來(lái)實(shí)現(xiàn)的定時(shí)任務(wù),只能靜態(tài)的創(chuàng)建定時(shí)任務(wù),不能動(dòng)態(tài)修改、添加、刪除、啟/停任務(wù),下面通過(guò)本文給大家介紹Springboot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)管理的方法,感興趣的朋友跟隨小編一起看看吧
    2023-07-07

最新評(píng)論