목차
🎜🎜버스 잠금🎜 🎜 🎜 " > 🎜🎜버스 잠금🎜 🎜 🎜
Java Java인터뷰 질문들 초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS

초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS

Aug 24, 2023 pm 03:09 PM
자바 면접 질문

머리말

Java 동시 프로그래밍 시리즈의 추가 부분C A S(비교 및 교환), 기사 스타일은 여전히 ​​이해하기 쉬운 그림과 텍스트로 가득 차 있어 독자가 면접관과 미친 대화를 나눌 수 있습니다. C A S(Compare and swap),文章风格依然是图文并茂,通俗易懂,让读者们也能与面试官疯狂对线。

C A S作为并发编程必不可少的基础知识,面试时C A S也是个高频考点,所以说C A S是必知必会,本文将带读者们深入理解C A S

C A S code>동시 프로그래밍에 대한 필수적인 기본 지식으로 인터뷰 시<code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px; 여백 왼쪽: 2px;배경 색상: rgba(27, 31, 35, 0.05); 글꼴 계열: " operator mono consolas monaco menlo monospace break-all rgb>C A S도 고주파 테스트 사이트이므로 C A S는 꼭 알아야 할 내용이며, 이 기사는 독자들에게 심층적인 이해를 제공할 것입니다.C A S. 🎜

개요

초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS

CA S의 기본 개념

C A S(compareAndSwap)也叫比较交换,是一种无锁原子算法,映射到操作系统就是一条cmpxchg硬件汇编指令(保证原子性),其作用是让C P U将内存值更新为新值,但是有个条件,内存值必须与期望值相同,并且C A S작업은 사용자 모드와 커널 모드 간 전환이 필요하지 않으며, 사용자 모드에서 직접 메모리를 읽고 씁니다(블로킹/스레드가 없음을 의미). 컨텍스트 전환).

它包含3个参数<code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px; background-color : rgba(27, 31, 35, 0.05); 글꼴 계열: " operator mono consolas monaco menlo monospace break-all rgb> C A S(V,E,N)V表示待更新的内存值,E表示预期值,N表示新值,当 V值等于E值时,才会将V值更新成N值,如果V值和E值不等,不做更新,这就是一次C A S적 작업。3个参数C A S(V,E,N)V表示待更新的内存值,E表示预期值,N表示新值,当 V值等于E值时,才会将V值更新成N值,如果V值和E值不等,不做更新,这就是一次C A S的操作。

초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS

简单说,C A S

초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS

简单说,C A S외부 발행은 个期望值, 也就是你认为这个变weight现에서 应该是什么样子의, 如果变weight는 不是你想象的那样,说明它已经被别人修改过了,你只需要重新读取,设置新期望值,再次尝试修改就好了。🎜

C A S가 원자성을 보장하는 방법

원자성은 하나 이상의 작업이 C P U 실행 중에 중단할 수 없는 기능입니다. 실행되거나 실행되지 않으며 중간에 실행할 수 없습니다(중단될 수 없는 기능입니다) 또는 일련의 작업). C P U执行的过程中不被中断的特性,要么执行,要不执行,不能执行到一半(不可被中断的一个或一系列操作)。

为了保证C A S的原子性,C P U提供了下面两种方式

  • 总线锁定
  • 缓存锁定

总线锁定

总线(B U S)是计算机组件间的传输数据方式,也就是说C P U与其他组件连接传输数据,就是靠总线完成的,比如C P U

rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);">C A S 의 원자성, C PU는 다음 두 가지 방법을 제공합니다🎜
  • 버스 잠금 장치
  • 캐시 잠금
  • ul>

    🎜🎜버스 잠금🎜 🎜 🎜

    🎜버스(B U S)는 컴퓨터 구성 요소 간에 데이터를 전송하는 방법입니다. 즉, C P U는 다른 구성 요소와 연결하여 데이터를 전송합니다. 이는 C P U는 메모리를 읽고 씁니다. 🎜
    초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS

    总线锁定是指C P U使用了总线锁,所谓总线锁就是使用C P ULOCK#信号,当C P U에서 总线上输流LOCK#信号时,其他C P U적总线请求将被阻塞。C P U使用了总线锁,所谓总线锁就是使用C P U提供的LOCK#信号,当C P U在总线上输出LOCK#信号时,其他C P U的总线请求将被阻塞。

    초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS

    缓存锁定

    总线锁定方式虽然保证了原子性,但是在锁定期间,会导致大量阻塞,增加系统的性能开销,所以现代C P U为了提升性能,通过锁定范围缩小的思想设计出了缓存行锁定(缓存行是C P U초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS

    缓存锁결정

    🎜总线锁定方式虽然保证了原子性,但是在锁定期间,会导致大weight阻塞,增加系统的性能开销,所以现代C P U为了提升性能,通过锁定范围缩작은思想设计了缓存行锁定(🎜缓存行是C P U高速缓存存储的最小单位🎜)。🎜

    소위 캐시 잠금C PUC P U缓存行进行锁定,当缓存行中的共享变量回写到内存时,其他C P U会通过总线嗅探机制感知该共享变量是否发生变化,如果发生变化,让自己对应的共享变量缓存行失效,重新从内存读取最新的数据,缓存锁定是基于缓存一致性机制来实现的,因为缓存一致性机制会阻止两个以上C P U同时修改同一个共享变量(现代C P U基本都支持和使用缓存锁定机制)。

    C A S的问题

    C A S和锁都解决了原子性问题,和锁相比没有阻塞、线程上下文你切换、死锁,所以C A S要比锁拥有更优越的性能,但是C A S同样存在缺点。

    C A S캐시 라인

    을 잠그고, 캐시 라인의 공유 변수가 메모리에 다시 기록되면 다른C P U는 버스 스니핑 메커니즘을 통해 공유 변수가 변경되었는지 여부를 감지합니다. 해당 공유 변수 캐시 라인이 유효하지 않으며 최신 데이터를 메모리에서 다시 읽습니다. 캐시 잠금은 캐시 일관성 메커니즘을 기반으로 구현됩니다. 캐시 일관성 메커니즘은 두 개 이상의 C P U동일한 공유 변수를 동시에 수정 (🎜ModernC P U기본적으로 모두 캐시 잠금 메커니즘을 지원하고 사용합니다 🎜). 🎜<h1 data-tool="mdnice editor" style="margin-top: 30px;margin-bottom: 15px;font-weight:bold;font-size: 24px;"> <span style="display: none; "></span>C A S 문제</h1>🎜<code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px; margin- 왼쪽: 2px;배경색상: rgba(27, 31, 35, 0.05);글꼴군: " operator mono consolas monaco menlo monospace break-all rgb>C A S 및 잠금은 둘 다 원자성 문제를 해결합니다. 잠금에 비해 차단, 스레드 컨텍스트 전환 및 교착 상태가 없으므로 C A S는 잠금보다 성능이 우수하지만C A S동일 단점이 있습니다. 🎜🎜C A S 코드의 문제점은 다음과 같습니다🎜<ul class="list-paddingleft-2" data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;list-style-type: square;"> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><strong style="color: black;">공유 변수의 원자적 연산만 보장할 수 있습니다</strong></section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><strong style="color: black;">스핀 시간이 너무 깁니다(스핀 잠금 기준)</strong></section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><strong style="color: black;"><code style="overflow-wrap: break -word ;패딩: 2px 4px;테두리 반경: 4px;마진-오른쪽: 2px;마진-왼쪽: 2px;배경색: rgba(27, 31, 35, 0.05);글꼴 계열: " operator mono consolas monospace break-all rgb>ABAQuestionABA问题

只能保证一个共享变量原子操作

C A S只能针对一个共享变量使用,如果多个共享变量就只能使用锁了,当然如果你有办法把多个变量整成一个变量,利用C A S也不错,例如读写锁中state

🎜

단 하나의 공유 변수만 원자적 작업을 보장할 수 있습니다.

C A S는 하나의 공유변수에만 사용할 수 있습니다. 공유변수가 여러 개인 경우에는 잠금만 사용할 수 있습니다. 물론, C A S도 좋습니다(예: 읽기-쓰기 잠금상태의 상위 및 하위 비트. 🎜

스핀 시간이 너무 깁니다

스레드가 잠금 획득에 실패하면 차단 및 일시 중단되지 않고 성공할 때까지 일정 시간 후에 다시 획득을 시도합니다. 일종의 루프 획득 메커니즘을 스핀 잠금이라고 합니다(스핀락). spinlock)。

自旋锁好处是,持有锁的线程在短时间内释放锁,那些等待竞争锁的线程就不需进入阻塞状态(无需线程上下文切换/无需用户态与内核态切换),它们只需要等一等(自旋),等到持有锁的线程释放锁之后即可获取,这样就避免了用户态和内核态的切换消耗。

自旋锁坏处显而易见,线程在长时间内持有锁,等待竞争锁的线程一直自旋,即CPU一直空转,资源浪费在毫无意义的地方,所以一般会限制自旋次数。

最后来说自旋锁的实现,实现自旋锁可以基于C A S实现,先定义lockValue对象默认值11代表锁资源空闲,0

스핀 잠금의 장점은 잠금을 보유하고 있는 스레드가 짧은 시간에 잠금을 해제하고, 경쟁 잠금을 기다리는 스레드는 차단 상태에 들어갈 필요가 없다는 것입니다. 사용자 모드 및 커널 모드 전환), 잠금을 보유하고 있는 스레드가 잠금을 획득하기 전에 잠금을 해제할 때까지 기다려야(🎜spin)하므로 사용자 모드와 커널 모드 사이를 전환하는 소비를 방지할 수 있습니다. 커널 모드. 🎜🎜스핀 잠금의 단점은 명백합니다. 스레드가 잠금을 오랫동안 보유하고 경쟁 잠금을 기다리는 스레드가 계속 회전합니다. 즉, CPU가 계속 유휴 상태가 되어 의미 없는 곳에 리소스가 낭비되므로 일반적으로 스핀 수가 제한된. 🎜🎜마지막으로 스핀 잠금 구현에 대해 이야기하겠습니다. C A S 구현, 먼저 lockValue객체 기본값1,1은 잠금 리소스가 사용 가능함을 의미합니다. 0은 잠금 리소스가 사용 중임을 의미하며 코드는 다음과 같습니다🎜
public class SpinLock {
    
    //lockValue 默认值1
    private AtomicInteger lockValue = new AtomicInteger(1);
    
    //自旋获取锁
    public void lock(){

        // 循环检测尝试获取锁
        while (!tryLock()){
            // 空转
        }

    }
    
    //获取锁
    public boolean tryLock(){
        // 期望值1,更新值0,更新成功返回true,更新失败返回false
        return lockValue.compareAndSet(1,0);
    }
    
    //释放锁
    public void unLock(){
        if(!lockValue.compareAndSet(1,0)){
            throw new RuntimeException("释放锁失败");
        }
    }

}
로그인 후 복사

AtomicInteger类型的lockValue变量,AtomicIntegerJava基于C A S实现的Integer原子操作类,还定义了3个函数lock、tryLock、unLock

tryLock 함수는 위에 정의되어 있습니다 - 잠금을 획득하세요

  • 期望值1,更新值0
  • C A S更NewC A S更新
  • 如果期望值与lockValue值相等,则lockValue值更新为0,返回true,否则执行下面逻辑
  • 如果期望值与lockValue值不相等,不做任何更新,返回false

如果期望值与lockValue值上等,则lockValue值更新为0,返回 true,否则执行下面逻辑

🎜🎜🎜🎜🎜如果期望值与lockValue值不任何更新,返回거짓🎜🎜🎜🎜🎜unLock函数-释放锁🎜
  • 期望值0, 새로운 버전10,更新值1
  • C A S更新
  • 如果期望值与lockValue值相等,则lockValue值更新为1,返回true,否则执行下面逻辑
  • 如果期望值与lockValue值不相等,不做任何更新,返回false

C A S更新

🎜🎜 🎜🎜🎜如果期望值与lockValue值상等,则lockValue值更新为1 ,返回true ,否则执行下면逻辑🎜🎜🎜🎜 🎜🎜如果期望值与lockValue值不상等, 不做任何更新,返回false🎜🎜🎜🎜🎜lock函数-自旋获取锁🎜<ul class="list-paddingleft-2" data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;list-style-type: square;"><li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><strong style="color: black;">실행<code style='overflow-wrap: break-word;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(255, 100, 65);'>tryLock函数,返回true停止,否则一直循环
초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS

从上图可以看出,只有tryLock成功的线程(lockValue更新为0),才会执行代码块,其他线程个tryLock自旋等待lockValue被更新成1tryLock成功的线程执行unLocklockValue更新为1),自旋的线程才会tryLock성공했습니다.

ABA 문제

C A S需要检查待更新的内存值有没有被修改,如果没有则更新,但是存在这样一种情况,如果一个值原来是A,变成了B,然后又变成了A,在C A S확인해 보면 수정되지 않은 것을 확인할 수 있습니다.

쓰레드가 2개 있다고 가정하면, 쓰레드1读取到内存值A,线程1时间片用完,切换到线程2,线程2也读取到了内存值A,并把它修改为B值,然后再把B值还原到A值,简单说,修改次序是A->B->A,接着线程1恢复运行,它发现内存值还是A,然后执行C A S操作,这就是著名的ABA가 문제지만 문제는 없는 것 같습니다.

단순한 데이터 구조이므로 실제로는 문제가 없습니다. 복잡한 데이터 구조라면 문제가 있을 수 있습니다. (AtomicReference可以把C A S使用在对象上),以链表数据结构为例,两个线程通过C A S去删除头节点,假设现在链表有A->B노드

를 사용하세요.)
초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS
  • 线程1删除A节点,B节点成为头节点, 正要执行C A S(A,A,B) 时,时间文 完,切换到线程 21删除A节点,B节点成为头节点,正要执行C A S(A,A,B)时,时间片用完,切换到线程2
  • 线程2删除A、B节点
  • 线程2加入C、A节点,链表节点变成A->C
  • 线程1重新获取时间片,执行C A S(A,A,B)
  • 丢失C
  • 🎜线程2 删除A、B节点🎜🎜🎜🎜线程2加入C、A节点,链表节点变成A->C 코드>🎜🎜🎜🎜线程1 새로 추가된 获取时间 Images 执行C A S(A, A,B)🎜🎜🎜🎜丢失C节点🎜🎜

해결하려면A B A问题也非常简单,只要追加版本号即可,每次改变时加1,即A —> B —> A,变成1A —> 2B —> 3A,在Java中提供了AtomicStampedRdference可以实现这个方案(面试只要问了C A S,就一定会问ABA 이것을 이해해야 합니다).

위 내용은 초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

인터뷰어: Spring Aop 공통 주석 및 실행 순서 인터뷰어: Spring Aop 공통 주석 및 실행 순서 Aug 15, 2023 pm 04:32 PM

Spring을 알아야 하므로 Aop의 모든 알림 순서에 대해 이야기해 보겠습니다. Spring Boot 또는 Spring Boot 2는 Aop의 실행 순서에 어떤 영향을 줍니까? AOP에서 직면한 함정에 대해 알려주십시오.

특정 그룹과의 인터뷰: 온라인에서 OOM을 발견하면 어떻게 문제를 해결해야 합니까? 어떻게 해결하나요? 어떤 옵션이 있나요? 특정 그룹과의 인터뷰: 온라인에서 OOM을 발견하면 어떻게 문제를 해결해야 합니까? 어떻게 해결하나요? 어떤 옵션이 있나요? Aug 23, 2023 pm 02:34 PM

OOM은 코드나 JVM 매개변수 구성으로 인해 프로그램에 취약점이 있음을 의미합니다. 이 기사에서는 Java 프로세스가 OOM을 트리거할 때 문제를 해결하는 방법에 대해 독자에게 설명합니다.

초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS 초보자도 BAT 면접관과 경쟁할 수 있습니다: CAS Aug 24, 2023 pm 03:09 PM

자바 동시 프로그래밍 시리즈의 추가 챕터인 C A S(비교 및 교환)는 여전히 이해하기 쉬운 스타일로 그림과 텍스트를 포함해 독자들이 면접관과 열띤 대화를 나눌 수 있도록 해준다.

Ele.me의 필기 시험 문제는 간단해 보이지만 많은 사람들을 당황하게 합니다. Ele.me의 필기 시험 문제는 간단해 보이지만 많은 사람들을 당황하게 합니다. Aug 24, 2023 pm 03:29 PM

많은 회사의 필기 시험 문제를 과소평가하지 마십시오. 함정이 있으며 우연히 함정에 빠질 수 있습니다. 이런 주기에 관한 필기시험 문제를 접하게 된다면 차분하게 생각하고 차근차근 풀어나가시길 권합니다.

지난주에 XX보험 인터뷰했는데 멋있었어요! ! ! 지난주에 XX보험 인터뷰했는데 멋있었어요! ! ! Aug 25, 2023 pm 03:44 PM

지난 주에 그룹의 한 친구가 Ping An Insurance와 인터뷰를 하러 갔습니다. 결과는 다소 아쉽지만, 말씀하신 것처럼 기본적으로 모든 질문에 낙담하지 않기를 바랍니다. 면접 질문을 외워야 면접이 해결될 수 있으니, 열심히 해주세요!

5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함) 5개의 문자열 면접 질문, 10% 미만의 사람들이 모두 올바르게 답할 수 있습니다! (답변 포함) Aug 23, 2023 pm 02:49 PM

​이 기사에서는 Java String 클래스에 관한 5가지 면접 질문을 살펴보겠습니다. 저는 인터뷰 과정에서 이 5가지 질문 중 몇 가지를 직접 경험했습니다. 이 기사는 이러한 질문에 대한 답변이 왜 이런지 이해하는 데 도움이 될 것입니다.

메이투안, 대답할 수 있는지 볼까? 메이투안, 대답할 수 있는지 볼까? Aug 24, 2023 pm 03:51 PM

메이투안, 대답할 수 있는지 볼까?

100개의 Linux 인터뷰 질문과 답변을 수집하는 것이 좋습니다 100개의 Linux 인터뷰 질문과 답변을 수집하는 것이 좋습니다 Aug 23, 2023 pm 02:37 PM

이 기사에는 Linux 개요, 디스크, 디렉토리, 파일, 보안, 구문 수준, 실제 전투, 파일 관리 명령, 문서 편집 명령, 디스크 관리 명령, 네트워크 통신 명령, 시스템 관리 명령, 백업을 다루는 총 30,000 단어가 넘습니다. 압축 명령 등 Linux 지식 포인트 해체.

See all articles