synchronized 및 Lock의 차이점
19749 단어 오디션 컬렉션LockConditionsynchronized
1. 원시 구성
synchronized는 키워드가 JVM 차원에 속하고 모니터(밑바닥은 모니터 대상을 통해 완성되며 사실wait/notify 등 방법도 모니터 대상에 의존하여 동기화 블록이나 방법에서만 wait/notify 등 방법을 호출할 수 있다) Lock은 구체적인 클래스(java.util.concurrent.locks.Lock)는api 차원의 자물쇠이다
2. 사용 방법
synchronized는 사용자가 수동으로 자물쇠를 풀 필요가 없습니다. synchronized 코드가 실행된 후 시스템은 자동으로 자물쇠에 대한 점용Reentrant Lock을 방출합니다. 사용자가 수동으로 자물쇠를 방출해야 합니다. 만약 주동적으로 자물쇠를 방출하지 않으면 자물쇠가 사라질 수 있습니다. lock () 와 unlock () 방법은try/finally 문장 블록에 맞추어 완성해야 합니다.
3. 대기 중 중단 가능 여부
synchronized는 중단할 수 없습니다. 이상을 던지거나 ReentrantLock을 정상적으로 실행하지 않으면 중단할 수 없습니다.제한 시간 설정 방법tryLock(long timeout, Time Unit unit) 2.lockInterruptibly () 네모난 코드 블록에서interrupt () 방법을 호출하면 중단할 수 있습니다
4. 잠금이 공평한지 여부
synchronized 비공평 자물쇠 Reentrant Lock 둘 다 가능합니다. 기본 비공평 자물쇠는 구조 방법으로boolean 값을 전송할 수 있고true는 공평합니다.
5, 잠금 바인딩 여러 조건 Condition
synchronized는Reentrant Lock이 없습니다. 그룹을 나누어 깨워야 할 라인을 깨우는 데 사용되지 않습니다. synchronized처럼 랜덤으로 한 라인을 깨우거나 모든 라인을 깨우는 것이 아니라 정확하게 깨울 수 있습니다.
Condition 예제 코드 사용
/**
* @author shihangqi
* @date 2019/10/29 - 10:43
*
*
* : , A->B->C , :
* AA 5 ,BB 10 ,CC 15
*
* AA 5 ,BB 10 ,CC 15
* ...
* 10
*/
class ShareResource{
private int number = 1; //A:1 B:2 C:3
private Lock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void print5(){
lock.lock();
try{
//1
while (number!=1){
c1.await();
}
//
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+"\t "+i);
}
//
number = 2;
c2.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void print10(){
lock.lock();
try{
//1
while (number!=2){
c1.await();
}
//
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"\t "+i);
}
//
number = 3;
c3.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void print15(){
lock.lock();
try{
//1
while (number!=3){
c1.await();
}
//
for (int i = 0; i < 15; i++) {
System.out.println(Thread.currentThread().getName()+"\t "+i);
}
//
number = 1;
c1.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
public class SyncAndReentrantLockDemo {
public static void main(String[] args) {
ShareResource shareResource = new ShareResource();
for(int i = 1; i <= 10; i++){
new Thread(()->{
shareResource.print5();
},"A").start();
}
for(int i = 1; i <= 10; i++){
new Thread(()->{
shareResource.print10();
},"B").start();
}
for(int i = 1; i <= 10; i++){
new Thread(()->{
shareResource.print15();
},"B").start();
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 멀티스레드 기반 – Lock 클래스대상 모니터의 라인을 지속해야만 동기화 코드를 실행할 수 있고 다른 라인은 이 라인이 대상 모니터를 방출하기를 기다릴 수 있다. Lock 클래스 자물쇠가 개체 자물쇠임을 알 수 있습니다.같은 lock 대상에 대한 l...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.