Flutter synchronized lock
2135 단어 fluttersynchronized고정 자물쇠
자료 찾기:synchronized:https://pub.dev/packages/synchronized#-readme-tab-
가장 기본적인 애플리케이션:
하나의 변수 a가 있습니다. 여러 개의 루트가 접근할 때, 같은 시간에 한 개의 루트만 읽거나 설정해야 합니다. (C#의 lock () {} 와 같습니다.우리가synchronized를 사용하여 처리할 수 있다면 매우 쉽다.예:
_lock.synchronized(()async{
//dealing with var a
//...
});
여기에 주의해야 할 점이 하나 있는데, 이 동기화 프로그램 블록 (프로그램 함수) 은 비동기적이다. 예를 들어
선생은 기본 프로젝트를 만들고 함수를 추가합니다. 함수의 내용은 다음과 같습니다.
debugPrint("${DateTime.now().toString()}$_bCounting");
_lock.synchronized( ()async{//block 1
_bCounting = !_bCounting;
debugPrint("1:in lock. changed to: $_bCounting");
_lock.synchronized( ()async{//block 2
_bCounting = !_bCounting;
debugPrint("2:in lock. changed to: $_bCounting");
});
});
변수 2개 추가
bool _bCounting = false;
var _lock = Lock();
단추를 추가하고 위의 함수를 호출하려면 누르십시오. 결과는 다음과 같습니다. (단추를 두 번 눌렀습니다)
2019-12-05 15:15:38.958 false
1:in lock. changed to: true
2:in lock. changed to: false
2019-12-05 15:15:45.535 false
1:in lock. changed to: true
2:in lock. changed to: false
록이 작동하지 않은 것 같습니다.두 번 호출되었는데 모두 프로그램 블록에 들어갔다.
실제 문제는 두 개의 프로그램 블록이 완성을 기다리지 않았기 때문에 실제 상황은 Block1이 먼저 완성되고 자물쇠를 풀고 순조롭게 Block2에 들어가는 것이다.
프로그램을 바꾸면 다음과 같습니다: Block2에 await가 추가되었습니다
debugPrint("${DateTime.now().toString()}$_bCounting");
_lock.synchronized( ()async{
_bCounting = !_bCounting;
debugPrint("1:in lock. changed to: $_bCounting");
await _lock.synchronized( ()async{ //added keyword "await"
_bCounting = !_bCounting;
debugPrint("2:in lock. changed to: $_bCounting");
});
});
실행 결과는 다음과 같습니다: (버튼을 두 번 눌렀습니다)
2019-12-05 15:23:22.241 false
1:in lock. changed to: true
2019-12-05 15:23:24.196 true
현재 실행할 때마다 Block2가 끝날 때까지 기다려야 하고, Block2가 필요로 하는 자원은 Block1이 먼저 끝날 때까지 기다려야 하며, 서로 기다리는 것은 사라진 자물쇠가 된다.
--END--
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
콘텐츠 SaaS | 모바일 네이티브 개발용 Flutter SDK기본 모바일 지원을 위해 Bloomreach Content Flutter SDK로 시작하세요. Flutter는 단일 코드베이스에서 아름답고 고유하게 컴파일된 다중 플랫폼 애플리케이션을 빌드하기 위한 오픈 소스 프레임...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.