class SplitedConcurrentClass{
private int atomicCount;
private Object atomicVal;
private final Object lockCntObj = new Object();
private final Object lockValObj = new Object();
public void setCnt(int cnt){
synchronize(lockCntObj){
...
}
}
public void setVal(Object val){
synchronize(lockValObj){
...
}
}
}
예시) array가 필드에 할당되면 하나로 묶는게아니라 내부 메모리 접근정도 각각 확인해서 분리해서 sync하게 함. => HashMap이나 LinkedList 같은것들 쓰더라도 마찬가지 내부 자료구조 파악한 뒤에 메모리 접근 위치 다르면 각각 다른 obj할당해서 sync걸음.
class StripedConcurrentClass{
private int atomicCount;
private Object[] atomicVal;
private final Object lockCntObj = new Object();
private final Object[] lockValObj = new Object();
public void setCnt(int cnt){
synchronize(lockCntObj){
...
lockValObj::add(cnt); //수도코드임 걍 cnt따라서 올리도록하는거.
}
}
public void setVal(Object val,int idx){
synchronize(lockValObj[idx]){
...
atomicVal[idx]::blabla..~~ //atomicVal[idx]만 만지도록 함.
}
}
}