자바 에서 Thread 에 대한 깊 은 이해(4)
간 소:
비관 적 자 물 쇠 는 동시 업데이트 충돌 이 발생 할 것 이 라 고 가정 하기 때문에 충돌 이 실제로 발생 하 든 안 하 든 자물쇠 체 제 를 사용한다.비관 적 인 자물쇠 에 비해 데이터 베 이 스 는 비관 적 인 자 물 쇠 를 사용 하 는데 비관 적 인 자 물 쇠 는 바로 자 물 쇠 를 잠 그 는 것 이 고 동기 화 방법 은 비관 적 인 자물쇠 에 속한다.
낙관적 인 잠 금 체 제 는 더욱 느슨 한 잠 금 체 제 를 채택 하고 낙관적 인 잠 금 은 상황 을 판단 하여 잠 금 여 부 를 결정 한다.
/**
*
* Created by 51422 on 2017/9/6.
*/
public class MiaoSha {
public static int goods=10;
/**
*
* @return -1
* @throws InterruptedException
*/
public int getGoods() throws InterruptedException {
//todo
Thread.sleep(100);// 100ms
return -1;
}
}
/**
*
*/
public void testMiaoSha(){
final MiaoSha miaoSha=new MiaoSha();
long st=System.currentTimeMillis();
ScheduledExecutorService service = Executors.newScheduledThreadPool(500);
for(int i=0;i<50000;i++){
service.execute(new Runnable() {
public void run() {
try {
int good=miaoSha.getGoods();
if(good>0){
System.out.println(" "+good);
};
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
service.shutdown();
try {
service.awaitTermination(2, TimeUnit.DAYS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" "+(System.currentTimeMillis()-st)+"ms");
}
1.1 비관 적 잠 금 처리 방식
이런 방식 은 화물 이 초과 발송 되 지 않 을 것 이 라 고 보장 할 수 있 지만 운행 속도 가 모든 스 레 드 가 동기 화 되 고 처리 시간 이 길 어 질 것 이 라 고 보장 할 수 없다.
/**
*
* Created by 51422 on 2017/9/6.
*/
public class MiaoSha {
public static int goods=10;
/**
*
* @return -1
* @throws InterruptedException
*/
public int getGoods() throws InterruptedException {
//todo
synchronized(this){
if(goods>0){
int no=goods;
goods--;
Thread.sleep(100);// 100ms
return no;
}
Thread.sleep(100);// 100ms
return -1;
}
}
}
1.2 낙관적 잠 금 처리 방식
version 변 수 를 추가 하면 현재 화물 버 전 을 표시 합 니 다.스 레 드 가 들 어 갈 때 version 을 가 져 옵 니 다.현재 version 과 비교 하면 잠 금 경쟁 에 참가 합 니 다.경쟁 에서 잠 금 을 얻 은 후에 version 이 만 료 되 는 것 을 방지 합 니 다.만약 에 version 이 아직도 통 증 이 있 으 면 현재 버 전 번호 가 같 으 면 주문 서 를 받 습 니 다.그러면 버 전 번호 가 같은 스 레 드 만 줄 을 서서 속 도 를 확보 하 는 동시에 화물 이 초과 발송 되 지 않도록 보장 할 수 있 습 니 다.
/**
*
* Created by 51422 on 2017/9/6.
*/
public class MiaoSha {
public static int goods=10;
public static int version=0;
/**
*
* @return -1
* @throws InterruptedException
*/
public int getGoods() throws InterruptedException {
//todo
int v=-1;
if(goods>0&&(v=version)>0){
if(v==version){
synchronized(this){
if(v==version){
version++;
int no=goods;
goods--;
Thread.sleep(100);// 100ms
return no;
}
}
}
}
Thread.sleep(100);// 100ms
return -1;
}
}
2.신 호 량 Semaphore
잠 금 은 하나의 스 레 드 만 자원 을 사용 할 수 있 고 지정 한 스 레 드 가 자원 에 동시에 접근 하지 못 하 게 할 수 있 습 니 다.이 럴 때 신 호 량 이 필요 합 니 다.지정 한 스 레 드 가 자원 에 접근 하 는 것 을 확보 할 수 있 습 니 다.예 를 들 어 2 개의 클 라 이언 트 만 서버 에 연결 하여 사용 할 수 있 습 니 다.
public static void SamephoreTest(){
Semaphore samephore=new Semaphore(2);
for(int i=0;i<3;i++){
new Thread(new Runnable() {
@Override
public void run() {
try {
samephore.acquire();
System.out.println(" !");
Thread.sleep(5000);// 5s
samephore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
acquire 와 release 는 쌍 을 이 루어 나타 나 야 합 니 다.그렇지 않 으 면 자원 잠 금 이 발생 합 니 다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.