国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目次
幾種保證線程安全的方案 " >幾種保證線程安全的方案
1. 通過(guò)synchronized關(guān)鍵字實(shí)現(xiàn)同步:
2. 通過(guò)Lock鎖實(shí)現(xiàn)同步
3. 使用 Atomic 原子類
4. 使用 LongAdder 原子類
CAS理論 " >CAS理論
CAS的實(shí)現(xiàn) " >CAS的實(shí)現(xiàn)
ホームページ Java &#&面接の質(zhì)問(wèn) 実際の面接の質(zhì)問(wèn): 同時(shí)に実行される CAS メカニズムについて話してください。

実際の面接の質(zhì)問(wèn): 同時(shí)に実行される CAS メカニズムについて話してください。

Jul 26, 2023 pm 03:05 PM
cas

學(xué)生がそのような面接を経験したことがあるかどうかはわかりません:

面接官 : CAS メカニズムについて並行して話してください
Xiao Ming : そうですね、CAS さんですね? 聞いたことがあるような気がします... 考えさせてください (脳が高速で考えています)

2 分が経過(guò)しました...
空気.

インタビュアーはじっと座っていられず咳払いをした: そうですね... そうですね、簡(jiǎn)単に教えていただけますか?
Xiao Minghanhanyixiao: へへ、忘れたようです...
インタビュアー: ああ、関係ありません。今日のインタビューはこれで終わりです。戻ってください。知らせてください
シャオ?ミンは落膽して立ち去りました...


笑わないでください、シャオ?ミンは実際には多くの人々の影であり、たくさんの人々がいます「面接中にぎこちない會(huì)話をしたクラスメート。もちろん私もその中に含まれています。実は、これは非常に殘酷な現(xiàn)実を反映しています。 基礎(chǔ)がしっかりしていないのです?!?

そこで問(wèn)題は、面接中に面接官を打ち負(fù)かし、巖のように安定するにはどうすればよいかということです。 ############學(xué)ぶ!ただ話すだけで何の役に立つのですか? 學(xué)ばなければなりません、買った本を読まなければなりません、買ったコースに従わなければなりません。ただゲームをしてテレビドラマを追いかけるだけではありません。強(qiáng)くなりたいなら、あなたはそうする必要があります。ハゲなければならない!
現(xiàn)在北京時(shí)間 0:08 です。私はコードで記事を書(shū)いています。どうですか?

実際の面接の質(zhì)問(wèn): 同時(shí)に実行される CAS メカニズムについて話してください。

スレッド セーフとは何かについて説明するための小さな例

同時(shí)実行性「Java プログラミングの基礎(chǔ)です。私たちは日常業(yè)務(wù)で並行性を扱うことがよくあります。もちろん、これもインタビューの焦點(diǎn)です?!箒K行プログラミングで最も言及される概念は スレッド セーフティです。まずコードの一部を見(jiàn)て、実行後に何が起こるかを見(jiàn)てみましょう:

public class Test {
    private static int inc = 0;

    public static void main(String[] args) {
     // 設(shè)置柵欄,保證主線程能獲取到程序各個(gè)線程全部執(zhí)行完之后的值
        CountDownLatch countDownLatch = new CountDownLatch(1000000);
        // 設(shè)置100個(gè)線程同時(shí)執(zhí)行
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
             // 循環(huán)10000次,對(duì)inc實(shí)現(xiàn) +1 操作
                for (int j = 0; j < 10000; j++) {
                    inc++;
                    countDownLatch.countDown();
                }
            }).start();
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 運(yùn)行完畢,期望獲取的結(jié)果是 1000000
        System.out.println("執(zhí)行完畢,inc的值為:" + inc);
    }
}

プログラムでは、スレッドを 100 個(gè)作成しました。各スレッドで、シェア変數(shù) inc が 10,000 回累積されます。同期実行すると、inc の最終値は 1,000,000 になるはずですが、マルチスレッドでは、プログラムは同時(shí)に実行されます。つまり、次のシナリオのように、異なるスレッドがメイン メモリから同じ?jìng)帳蛲瑫r(shí)に読み取る可能性があります。ある瞬間、メインメモリの inc 値が 1000 として読み取られ、自身のワーキングメモリ 1 では inc が 1001 になり、

  • スレッド B が同時(shí)にそれを読み出しました。メインメモリの値は 1000 で、自身の作業(yè)メモリにも inc 値 1 を設(shè)定し、inc は 1001 になります。
  • 彼らは、inc 値をメインメモリに書(shū)き込みたいと考えています。同期制御がないため、作業(yè)メモリの 1001 をメイン メモリに書(shū)き込む可能性があります;
  • その場(chǎng)合、メイン メモリが 2 つの 1 操作を?qū)g行していることは明らかです。実際の結(jié)果は 1 回だけで、1001 になりました。
  • これは、共有変數(shù)を同時(shí)に変更するマルチスレッドによって引き起こされる非常に典型的な問(wèn)題です。明らかに、その実行結(jié)果は私たちが分析したとおりですが、場(chǎng)合によってはそれを達(dá)成できないこともあります。1000000:
    執(zhí)行完畢,inc的值為:962370
  • 一部の人は、
volatile

キーワードを使用することでこの問(wèn)題を解決できると主張していますが、これは、volatile はスレッド間の可視性を保証できるため、つまりスレッドがメイン メモリ內(nèi)の最新データを読み取ることができるためです。そしてそれを操作します。

volatile はスレッドの 可視性 のみを保証できますが、スレッド操作の

原子性

は保証できないことに注意してください。スレッドはメイン メモリ値の最新の inc を読み取っていますが、 , ただし、reading,inc 1,write to mainmemory は 3 段階の操作であるため、volatile では共有変數(shù)のスレッド セーフの問(wèn)題を解決できません。 それでは、この問(wèn)題をどうやって解決すればいいのでしょうか? Java は次のソリューションを提供します。 <h2 id="span-style-display-inline-block-background-rgb-color-rgb-padding-px-px-px-border-top-right-radius-px-border-top-left-radius-px-margin-right-px-幾種保證線程安全的方案-span-span-style-display-inline-block-vertical-align-bottom-border-bottom-px-solid-efebe-border-right-px-solid-transparent-span"><span style="display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255, 255);padding: 3px 10px 1px;border-top-right-radius: 3px;border-top-left-radius: 3px;margin-right: 3px;">幾種保證線程安全的方案</span><span style="display: inline-block;vertical-align: bottom;border-bottom: 36px solid #efebe9;border-right: 20px solid transparent;"> </span></h2><h3 id="通過(guò)synchronized關(guān)鍵字實(shí)現(xiàn)同步">1. 通過(guò)synchronized關(guān)鍵字實(shí)現(xiàn)同步:</h3><pre class='brush:php;toolbar:false;'>public class Test { private static int inc = 0; public static void main(String[] args) { // 設(shè)置柵欄,保證主線程能獲取到程序各個(gè)線程全部執(zhí)行完之后的值 CountDownLatch countDownLatch = new CountDownLatch(1000000); // 設(shè)置100個(gè)線程同時(shí)執(zhí)行 for (int i = 0; i &lt; 100; i++) { new Thread(() -&gt; { // 循環(huán)10000次,對(duì)inc實(shí)現(xiàn) +1 操作 for (int j = 0; j &lt; 10000; j++) { // 設(shè)置同步機(jī)制,讓inc按照順序執(zhí)行 synchronized (Test.class) { inc++; } countDownLatch.countDown(); } }).start(); } try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(&quot;執(zhí)行完畢,inc的值為:&quot; + inc); } }</pre><p data-tool="mdnice編輯器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">在上面的代碼中,我們給 <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">inc ++ 外面加了一層代碼,使用 synchronized 設(shè)置類鎖,保證了代碼的同步執(zhí)行,這是一種基于JVM自身的機(jī)制來(lái)保障線程的安全性,如果在并發(fā)量比較大的情況下,synchronized 會(huì)升級(jí)為重量級(jí)的鎖,效率很低。synchronized無(wú)法獲取當(dāng)前線程的鎖狀態(tài),發(fā)生異常的情況下會(huì)自動(dòng)解鎖,但是如果線程發(fā)生阻塞,它是不會(huì)釋放鎖的

執(zhí)行結(jié)果:

執(zhí)行完畢,inc的值為:1000000

可以看到,這種方式是可以保證線程安全的。

2. 通過(guò)Lock鎖實(shí)現(xiàn)同步

public class Test {
    private static int inc = 0;
    private static Lock lock = new ReentrantLock();

    public static void main(String[] args) {
        // 設(shè)置柵欄,保證主線程能獲取到程序各個(gè)線程全部執(zhí)行完之后的值
        CountDownLatch countDownLatch = new CountDownLatch(1000000);

        // 設(shè)置100個(gè)線程同時(shí)執(zhí)行
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                // 循環(huán)10000次,對(duì)inc實(shí)現(xiàn) +1 操作
                for (int j = 0; j < 10000; j++) {
                 // 設(shè)置鎖
                    lock.lock();
                    try {
                        inc++;
                    } finally {
                     // 解鎖
                        lock.unlock();
                    }
                    countDownLatch.countDown();
                }
            }).start();
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("執(zhí)行完畢,inc的值為:" + inc);
    }
}

ReentrantLock的底層是通過(guò)AQS + CAS來(lái)實(shí)現(xiàn)的,在并發(fā)量比較小的情況下,它的性能不如 synchronized,但是隨著并發(fā)量的增大,它的性能會(huì)越來(lái)越好,達(dá)到一定量級(jí)會(huì)完全碾壓synchronized。并且Lock是可以嘗試獲取鎖的,它通過(guò)代碼手動(dòng)去控制解鎖,這點(diǎn)需要格外注意。

執(zhí)行結(jié)果:

執(zhí)行完畢,inc的值為:1000000

3. 使用 Atomic 原子類

public class Test {
    private static AtomicInteger inc = new AtomicInteger();

    public static void main(String[] args) {
        // 設(shè)置柵欄,保證主線程能獲取到程序各個(gè)線程全部執(zhí)行完之后的值
        CountDownLatch countDownLatch = new CountDownLatch(1000000);

        // 設(shè)置100個(gè)線程同時(shí)執(zhí)行
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                // 循環(huán)10000次,對(duì)inc實(shí)現(xiàn) +1 操作
                for (int j = 0; j < 10000; j++) {
                    inc.getAndAdd(1);
                    countDownLatch.countDown();
                }
            }).start();
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("執(zhí)行完畢,inc的值為:" + inc.get());
    }
}

AtomicInteger 底層是基于 CAS 的樂(lè)觀鎖實(shí)現(xiàn)的,CAS是一種無(wú)鎖技術(shù),相對(duì)于前面的方案,它的效率更高一些,在下面會(huì)詳細(xì)介紹。

執(zhí)行結(jié)果:

執(zhí)行完畢,inc的值為:1000000

4. 使用 LongAdder 原子類

public class Test {
    private static LongAdder inc = new LongAdder();

    public static void main(String[] args) {
        // 設(shè)置柵欄,保證主線程能獲取到程序各個(gè)線程全部執(zhí)行完之后的值
        CountDownLatch countDownLatch = new CountDownLatch(1000000);

        // 設(shè)置100個(gè)線程同時(shí)執(zhí)行
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                // 循環(huán)10000次,對(duì)inc實(shí)現(xiàn) +1 操作
                for (int j = 0; j < 10000; j++) {
                    inc.increment();
                    countDownLatch.countDown();
                }
            }).start();
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("執(zhí)行完畢,inc的值為:" + inc.intValue());
    }
}

LongAdder 原子類在 JDK1.8 中新增的類,其底層也是基于 CAS 機(jī)制實(shí)現(xiàn)的。適合于高并發(fā)場(chǎng)景下,特別是寫(xiě)大于讀的場(chǎng)景,相較于 AtomicInteger、AtomicLong 性能更好,代價(jià)是消耗更多的空間,以空間換時(shí)間。

執(zhí)行結(jié)果:

執(zhí)行完畢,inc的值為:1000000

CAS理論

講到現(xiàn)在,終于我們今天的主角要登場(chǎng)了,她就是CAS。

CAS的意思是比較與交換(Compare And Swap),它是樂(lè)觀鎖的一種實(shí)現(xiàn)機(jī)制。

什么是樂(lè)觀鎖?通俗的來(lái)說(shuō)就是它比較樂(lè)觀,每次在修改變量的值之前不認(rèn)為別的線程會(huì)修改變量,每次都會(huì)嘗試去獲得鎖,如果獲取失敗了,它也會(huì)一直等待,直到獲取鎖為止。說(shuō)白了,它就是打不死的小強(qiáng)。

而悲觀鎖呢,顧名思義,就比較悲觀了,每次在修改變量前都會(huì)認(rèn)為別人會(huì)動(dòng)這個(gè)變量,所以它會(huì)把變量鎖起來(lái),獨(dú)占,直到自己修改完畢才會(huì)釋放鎖。說(shuō)白了,就是比較自私,把好東西藏起來(lái)自己偷偷享用,完事了再拿出來(lái)給別人。像之前的synchronized關(guān)鍵字就是悲觀鎖的一種實(shí)現(xiàn)。

CAS是一種無(wú)鎖原子算法,它的操作包括三個(gè)操作數(shù):需要讀寫(xiě)的內(nèi)存位置(V)、預(yù)期原值(A)、新值(B)。僅當(dāng) V值等于A值時(shí),才會(huì)將V的值設(shè)為B,如果V值和A值不同,則說(shuō)明已經(jīng)有其他線程做了更新,則當(dāng)前線程繼續(xù)循環(huán)等待。最后,CAS 返回當(dāng)前V的真實(shí)值。CAS 操作時(shí)抱著樂(lè)觀的態(tài)度進(jìn)行的,它總是認(rèn)為自己可以成功完成操作。

CAS的實(shí)現(xiàn)

在Java中,JUC的atomic包下提供了大量基于CAS實(shí)現(xiàn)的原子類:

実際の面接の質(zhì)問(wèn): 同時(shí)に実行される CAS メカニズムについて話してください。

我們以AtomicInteger來(lái)舉例說(shuō)明。

AtomicInteger類內(nèi)部通過(guò)一個(gè)Unsafe類型的靜態(tài)不可變的變量unsafe來(lái)引用Unsafe的實(shí)例。

 // setup to use Unsafe.compareAndSwapInt for updates
private static final Unsafe unsafe = Unsafe.getUnsafe();

然后,AtomicInteger類用value保存自身的數(shù)值,并用get()方法對(duì)外提供。注意,它的value是使用volatile修飾的,保證了線程的可見(jiàn)性。

private volatile int value;

/**
 * Creates a new AtomicInteger with the given initial value.
 *
 * @param initialValue the initial value
 */
public AtomicInteger(int initialValue) {
    value = initialValue;
}

/**
 * Gets the current value.
 *
 * @return the current value
 */
public final int get() {
    return value;
}

一路跟蹤incrementAndGet方法到的末尾可以看到是一個(gè)native的方法:

/**
 * Atomically increments by one the current value.
 *
 * @return the updated value
 */
public final int incrementAndGet() {
    return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}

//  getAndAddInt 方法
public final int getAndAddInt(Object var1, long var2, int var4) {
    int var5;
    do {
        var5 = this.getIntVolatile(var1, var2);
    } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

    return var5;
}

// compareAndSet方法
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

可以看到其實(shí)incrementAndGet內(nèi)部的原理就是通過(guò)compareAndSwapInt調(diào)用底層的機(jī)器指令不斷比較內(nèi)存舊值和期望的值,如果比較返回false就繼續(xù)循環(huán)比較,如果返回true則將當(dāng)前的新值賦給內(nèi)存里的值,本次處理完畢。

由此我們知道,原子類實(shí)現(xiàn)的自增操作可以保證原子性的根本原因在于硬件(處理器)的相關(guān)指令支持。將語(yǔ)義上需要多步操作的行為通過(guò)一條指令來(lái)完成,CAS指令可以達(dá)到這個(gè)目的。

CAS の欠點(diǎn)

  • オプティミスティック ロックの実裝として、マルチスレッドがリソースを激しく競(jìng)合すると、複數(shù)のスレッドがスピンして待機(jī)すると、一定量の CPU リソースが消費(fèi)されます。
  • CAS には必然的に ABA 問(wèn)題が発生します。ABA 問(wèn)題の説明と解決策については、私の記事を參照してください: 面接官はあなたに尋ねます: ABA 問(wèn)題とは何か知っていますか? ?


さて、今回の CAS に関する共有はこれで終わりです。 Java プログラミングの基礎(chǔ)である同時(shí)実行性は、非常に重要な知識(shí)ポイントです。學(xué)生がこの側(cè)面をあまり理解していない場(chǎng)合は、この記事を読んだ後、自分でコードを入力して考えられるようにしてください。 CAS とは何か、長(zhǎng)所と短所、およびそれらを?qū)g裝する方法は何ですか。 もちろん、同時(shí)実行性は非常に大きな概念です。ここでは、いくつかのアイデアを示し、小さな知識(shí)ポイントの 1 つについて言及し、私自身の學(xué)習(xí)経験をいくつか紹介します。 適切に説明されていない點(diǎn)や間違っている點(diǎn)がある場(chǎng)合は、プライベート メッセージを送って一緒に話し合ってください。ありがとうございます。

私は プログラマー Qingge です。ここでのインタビューの質(zhì)問(wèn)はこれで終わりです。自分自身を改善して、次のレベルに進(jìn)みたいと思っています。學(xué)生工場(chǎng)內(nèi)の皆さんは私の公式アカウント Java 學(xué)習(xí)ガイド に注目してください。ここでは、毎日実際のインタビューに基づいて Java 関連の知識(shí)を?qū)Wび、まとめ、あなたをサポートします。スキルを伸ばし、積み重ねて個(gè)人の力を高めます。また次回~

以上が実際の面接の質(zhì)問(wèn): 同時(shí)に実行される CAS メカニズムについて話してください。の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫(huà)像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫(xiě)真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫(xiě)真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CAS (中央認(rèn)証サービス) を介した PHP セキュリティ検証の実裝 CAS (中央認(rèn)証サービス) を介した PHP セキュリティ検証の実裝 Jul 24, 2023 pm 12:49 PM

CAS (CentralAuthenticationService) による PHP セキュリティ検証 インターネットの急速な発展に伴い、ユーザー権限管理と本人確認(rèn)の重要性がますます高まっています。 Web アプリケーションを開(kāi)発する場(chǎng)合、ユーザー データを保護(hù)し、不正アクセスを防止することが重要です。この目標(biāo)を達(dá)成するには、PHP セキュリティ検証に CAS (CentralAuthenticationService) を使用します。 CAS

Java CASの概念とは何ですか Java CASの概念とは何ですか May 03, 2023 pm 09:34 PM

1. 複數(shù)のスレッドがリソースに対して CAS 操作を同時(shí)に実行すると、1 つのスレッドだけが成功しますが、他のスレッドはブロックされず、他のスレッドは操作が失敗したというシグナルを受信するだけであることを説明します。 CAS が実際には楽観的ロックであることがわかります。 2. AtomInteger コードをたどると、最後に sum.misc.Unsafe が呼び出されることがわかります。 Unsafe という名前を見(jiàn)てください。これは、Java のクラスと可視性ルールの適切な穴を悪用する安全でないクラスです。速度を向上させるために、Unsafe は Java のセキュリティ標(biāo)準(zhǔn)にいくつかの妥協(xié)を加えています。 publicfinalnativebooleancompareAndSwapInt(Objec

JavaでCASを適用する方法 JavaでCASを適用する方法 Apr 18, 2023 pm 06:37 PM

CAS の説明: CAS (compareandswap)、比較および交換。マルチスレッド並列狀況でロックを使用することによって引き起こされるパフォーマンス損失を解決できるメカニズム。CAS 操作には、メモリ位置 (V)、期待される元の値 (A)、および新しい値 (B) の 3 つのオペランドが含まれます。メモリ位置の値が予想される元の値と一致する場(chǎng)合、プロセッサはその位置を新しい値に自動(dòng)的に更新します。それ以外の場(chǎng)合、プロセッサは何も行いません。スレッドはメイン メモリから num 値を取得し、num に対して操作します。値を書(shū)き込むとき、スレッドは取得した最初の num 値とメイン メモリ內(nèi)の num 値を比較します。それらが等しい場(chǎng)合、変更された値は num になります。それらが等しくない場(chǎng)合、成功するまで比較がループされます。 CAS製

CAS と Java オプティミスティック ロックの使用方法 CAS と Java オプティミスティック ロックの使用方法 May 01, 2023 pm 08:07 PM

CASCASとはCompareAndSwap、つまり比較と交換のことです。なぜ CAS はロックを使用しないのに、同時(shí)実行條件下でも安全なデータ操作を保証するのですか? その名前は実際に CAS の原理を非常に直観的に示しています。データを変更する具體的なプロセスは次のとおりです: CAS を使用してデータを操作する場(chǎng)合、データの元の値は現(xiàn)在のターゲット変數(shù)の値が、渡された元の値と同じかどうかを比較するメソッドに渡します。それらが同じであれば、ターゲット変數(shù)が他のスレッドによって変更されていないことを意味します。ターゲット変數(shù)の値を直接変更するだけです。ターゲット変數(shù)の値が元の値と異なる場(chǎng)合は、ターゲット変數(shù)を証明します。他のスレッドによって変更されています。この CAS の変更は失敗しました。上記のプロセスから、CAS が実際にデータの安全な変更を保証しますが、変更が失敗する場(chǎng)合もあります。

Java ロック同時(shí)実行性、ロックフリー同時(shí)実行性、および CAS サンプル分析 Java ロック同時(shí)実行性、ロックフリー同時(shí)実行性、および CAS サンプル分析 May 23, 2023 pm 01:34 PM

ロックされた同時(shí)実行性 ほとんどのプログラマ (もちろん、私も基本的にその一人です) にとって、同時(shí)プログラミングは、関連するデータ構(gòu)造にロック (Mutex) を追加することとほぼ同等です。たとえば、同時(shí)実行をサポートするスタックが必要な場(chǎng)合、最も簡(jiǎn)単な方法は、ロック std::sync::Mutex をシングルスレッド スタックに追加することです。 (Arc は、複數(shù)のスレッドがスタックの所有権を持てるようにするために追加されます) usestd::sync::{Mutex,Arc};#[derive(Clone)]structConcurrentStack{inner:Arc,}implConcurrentStack{pubfnnew()-> Self{

実際の面接の質(zhì)問(wèn): 同時(shí)に実行される CAS メカニズムについて話してください。 実際の面接の質(zhì)問(wèn): 同時(shí)に実行される CAS メカニズムについて話してください。 Jul 26, 2023 pm 03:05 PM

プログラムでは 100 個(gè)のスレッドを作成し、各スレッドは共有変數(shù) inc に対して 10,000 回の操作を蓄積しました。同期的に実行された場(chǎng)合、inc の最終値は 1,000,000 になるはずですが、マルチスレッドではプログラムが並行して実行されることがわかります。つまり、異なるスレッドがメイン メモリから同時(shí)に同じ?jìng)帳蛘iみ取る可能性があります。

面接官は「ABA 問(wèn)題とは何か知っていますか?」と尋ねます。 面接官は「ABA 問(wèn)題とは何か知っていますか?」と尋ねます。 Jul 26, 2023 pm 03:09 PM

この問(wèn)題は、CAS 分野の古典的な ABA 問(wèn)題の分析に関するもので、実際の業(yè)務(wù)で遭遇したことがあるかどうかはわかりませんが、これが面接での並行性知識(shí)テストの焦點(diǎn)です。この種の問(wèn)題に遭遇したことがない場(chǎng)合は、上記のコードを自分で実行することをお?jiǎng)幛幛筏蓼埂?/p>

springboot に基づいて CAS クライアントを構(gòu)築する方法 springboot に基づいて CAS クライアントを構(gòu)築する方法 May 14, 2023 am 10:46 AM

1. 新しい springboot プロジェクトを作成し、依存関係 org.jasig.cas.clientcas-client-support-springboot3.6.22 を?qū)毪贰?@EnableCasClient アノテーション packagecom.codetiler.demo;importorg.jasig.cas.client.boot.configuration を構(gòu)成します。 EnableCasClient;importorg.springframework.boot.SpringApplication;importorg.spring

See all articles