리뷰가 일으킨 단례 모델에 대한 사고
MemcachedClientFactory{
private MemcachedConnectionBuilder memcachedConnectionBuilder;
private String servers;
private static MemcachedClient memcachedClient;
private MemcachedClientFactory(){
}
private MemcachedClientFactory(MemcachedConnectionBuilder memcachedConnectionBuilder, String servers){
this. memcachedConnectionBuilder= memcachedConnectionBuilder;
this.servers=servers;
}
public static MemcachedClient createClient(){
if(memcachedClient==null){
this.memcahcedClien= new MemcachedClient(memcachedConnectionBuilder.build(),AddrUtil.get(servers));
}
return this.memcahcedClient;
}
}
}
최초의 문제로 돌아가면 왜 100여 개의 연결이 있습니까?위의 이 묘사는 정말 하나의 연결만 생기는 것을 보장할 수 있습니까?분명히 안 돼, 왜?다중 스레드 병발!문제는 여기에 있다. 여러 개의 라인이 동시에createClient () 방법에 들어갔을 때,memcachedClient가null로 판단되었을 때 여러 개의 연결이 생겼다.하, 문제를 찾았다.
향상된 기능:
public static synchronizd MemcachedClient createClient(){
if(memcachedClient==null){
this.memcahcedClien= new
MemcachedClient(memcachedConnectionBuilder.build(),AddrUtil.get(servers));
}
return this.memcahcedClient;
}
이렇게 하면 OK, 변동은 매우 간단하다.프로그램은 문제가 없을 뿐만 아니라, 단지 하나의 연결만 보장할 수 있다.그러나 이 문제를 버리고 우리는 어떻게 단례 모델에서의 병발 문제를 해결할 것인가에 대해 깊이 생각해 볼 수 있다.
제가 요약한 바에 의하면 단례 모델이 병렬적으로 보내는 문제를 해결하려면 대략 세 가지 방식이 있습니다.
1. 지연 실례화를 사용하지 않고 미리 실례화한다.
프로그램 개요:
Public Class Singleton{
private static Singleton instance=new Singleton();
private Singleton(){};
public static Singleton getInstance(){
return instance;
}
}
이렇게 할 때 jvm는 클래스를 불러올 때 바로 이 실례를 만들었기 때문에 이렇게 하는 전제 조건은 이 실례를 만드는 부담이 크지 않다. 나는 성능을 너무 많이 고려하지 않고 우리는 이 실례가 반드시 사용될 것이라고 확인한다.사실 내 앞의 코드도 이 방식을 충분히 사용할 수 있다.
MemcachedClientFactory{
private MemcachedConnectionBuilder memcachedConnectionBuilder;
private String servers;
private static MemcachedClient memcachedClien= new
MemcachedClient(memcachedConnectionBuilder.build(),AddrUtil.get(servers));
private MemcachedClientFactory(){
}
private MemcachedClientFactory(MemcachedConnectionBuilder memcachedConnectionBuilder, String servers){
this. memcachedConnectionBuilder= memcachedConnectionBuilder;
this.servers=servers;
}
public static MemcachedClient createClient(){
return this.memcahcedClient;
}
}
}
그러나 문제가 없는 것 같지만, 누군가가memcachedClient를 잘못 호출하면 위험이 있다.shutdown () 방법, 모든 프로그램이 새로운memcachedClient를 재생할 수 없습니다.물론 극단적인 상황이지만 코드의 건장을 위해 다시 바꿀 수 있다.
public static MemcachedClient createClient(){
if(memcachedClient==null){
this.memcahcedClien= new MemcachedClient(memcachedConnectionBuilder.build(),AddrUtil.get(servers));
}
return this.memcahcedClient;
}
2. synchronized 키워드를 사용합니다.이렇게 하면 동기화 문제를 보장할 수 있지만synchronized를 사용하는 비용이 매우 크고 성능에 심각한 영향을 미칠 수 있다는 것을 우리는 알고 있다. 따라서 이 전제를 사용하면 이 방법을 자주 사용하지 않거나 이 instance를 만드는 비용이 특별히 크지 않을 것을 확인하는 것이다.개선이 가능한지 아래를 보십시오.
3. "이중 검사 잠금"을 사용하여 getInstance에서 동기화 사용
public Class Singleton{
private volatile static Singleton instance;
private Singleton(){};
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Swift] Advanced Operators데이터 구조 내에서 데이터를 비트 단위로 조작할 수 있는 연산자 비트 XOR 연산자는 이 두 비트를 출력 값에서 1로 설정한다. 음수 비트를 양수처럼 왼쪽과 오른쪽으로 이동할 수 있으며, 왼쪽으로의 모든 교대마다 두...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.