Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

OOP와 비교해본 Actor Model


OOP

Code Block
languagerubyc#
title일반적 OOP 설계방법OOP에서 스레드 세이프한 객체 적성법
linenumberstrue


    public class DeepThought
    {
        private int state;

        public int State
        {
            get
            {
                lock (this)
  def initialize(state)                {
                    Thread.Sleep(3000); //나의 상태에대한 깊은 생각에 빠짐..
    @state =                return state;
  end

  def meaning_of_life
    # This is a long running calculation where
    @state gets mutated frequently to hold
    # intermediary calculations
  end
end

dt = DeepThought.new(data                }                
            }

            set
            {
                lock (this)
                {
                    //깊은 생각에 빠질땐 누구도 건들지 말기를 바람,그대가 멀티쓰레드라 할지라도
                    state = value;
                }                
            }
        }        
    }
var dt = new DeepThought()

Thread.new { console.log( dt.meaning_of_lifeState ) }
Thread.new { dt.meaning_of_lifeState=1 }

#=> BOOM!

 자신의 상태변경및 제공을 멀티스레드에 안전한 방식으로 OOP를 설계한다고 가정하자

이 클래스는 이야기한다, '자신의 속성을 Lock(metex)를 걸어 , 누군가 나를  접근하고 있을때, 해당 오브젝트를 건들지마(또는 기달려야해)' 라고 이야기하고 있다.OOP는 멀티 쓰레드환경에서 자신의 속성값을 접근가능하게 해야하고 공유의 원칙으로 설계가 됩니다


일반적으로 OOP 관점에서는 스레드 세이프하다란 의미는 메스드사용시 공유객체를 Lock을 걸거나? 별도의 독립된 객체를 추가로 생성하여

동시처리,동시접근에대한 문제를 풀려고 한다. 공통점은 특정한 속성값이 멀티쓰레드에서 동시접근 제한 방지를 위해 공유가된다는 점이다.



접근공유문제와  동시성 문제 해결하기위해, 복잡한 쓰레드 모델을(CriticalSection,SpinLock,Mutex,Semaphore) 익혀야하며

확장하기가 어려워 집니다클러스터 구성하기도 전에, 단일노드에서 효율적 동시성 접근문제에 대해 많은 고민을 해야합니다.

Actor

액터의 기본철학은, 액터가 차지하는 메모리 공간은 어느 다른 쓰레드혹은 동일한 액터에서도 자기자신의 속성을 접근할수 없다

...