쓰레드 동기화라고 하면 전통적인 방법은 락을 거는 것입니다.
크리티컬 섹션, 뮤텍스, 세마포어 등의 동기화 객체를 사용하여 동기화를 해주게 됩니다.

Lock을 걸면, 다른 쓰레드에서는 락이 걸린 부분에 다다르면 락이 풀릴때까지 대기하는 것이지요.
예를 들면, 은행에서 현금인출기 앞에서 줄을 서는 상황과 비슷합니다.
이미 앞에서 대기하고 있는 사람이 있으면 그 사람들이 일을 다 처리할때까지 대기해야 합니다.

다시말하면, Lock을 거는 코드를 만나면 먼저 Lock을 걸고 작업을 처리한뒤, Unlock을 할때까지 대기하게 됩니다.
추가적으로, 이미 기다리던 애가 있으면 걔역시 Unlock이 되는 순간 다시 Lock을 걸고 작업을 하고 Unlock을 하기 때문에
계속해서 그러한 작업들을 기다리고, 자기 차례가 와야 동작이 가능하다는 것입니다.

누군가는 더 쉬운 비유를 들었더군요.
어떤한 방이 있고 방문이 있습니다. 먼저 온 사람은 방문을 열고 들어간뒤 방문을 잠가버립니다.
그러면 방문이 잠긴 것이 풀어지기 전까지는 못 들어가죠.
먼저 들어갔던 사람이 방에서 할 일을 다 한뒤에 방문을 열고 나오면, 다음 사람이 들어가서 방문을 잠그고...
뭐 이걸 반복하는 것이라고 비유해서 설명하시더군요.

이거와 반대되는 개념을 생각해 볼 수 있습니다.
Lock은 걸지 않고, 동기화 처리할 코드 블럭을 무조건 진입은 할 수 있게 합니다.
대신에 먼저 작업하던 애는 작업이 실패한 걸로 처리됩니다.
누군가 내가 일하는 동안에 간섭을 했기 때문에 작업이 엉망이 되었으므로, 그 작업이 실패한걸로 보고 포기하는 겁니다.
그러고 나서 다시 시도합니다. 계속 시도하다 보면 남이 간섭안하는 때가 올테니까요.

뭐 이런 개념이 바로 STM 이라고 합니다. 소프트웨어 트랜잭셔널 메모리 (Software Transactional Memory)의 약자입니다.
이 용어를 풀어보면, 일단 소프트웨어 방식으로 구현했다는 뜻입니다. 실제로 하드웨어 트랜잭셔널 메모리도 있습니다. 그러나 기술적인 문제로 소프트웨어 트랜잭셔널 메모리를 주로 사용한다고 합니다.
트랜잭셔널은 트랙잭션 하다는 건데... DB의 트랜잭션을 생각하면 됩니다.
그리고 메모리는 말그대로 메모리를 대상으로 한다는 뜻입니다.
그러니까 소프트웨어적으로 트랜잭션 처리가 되는 메모리를 사용할 수 있게 하는 기능이라는 것입니다.

트랜잭션에 대해 더 자세히 설명을 하자면,
DB의 트랜잭션은 어떤 일련의 쿼리들을 트랜잭션으로 묶어두면 해당 쿼리들이 실행되다가 하나라도 실행에 실패하면 모든 작업이 실패한걸로 보고 트랜잭션 진입 이전의 상태로 복원을 해 줍니다.
은행 이체의 예를 들자면... (가장 많이 드는 예일 겁니다.)
A의 계좌에서 B의 계좌로 이체한다고 하면 실제로는, A의 계좌로부터 돈을 인출한 뒤, B의 계좌로 입금하게 됩니다. 근데 인출만 하고 입금하는 과정에서 실패하게 되면, 당연히 문제가 발생합니다.
돈이 이체가 되지 않았는데 돈만 이체되어 버리고.. 그러면 괜히 돈만 없어지게 되죠.
그래서 그럴 경우는 인출자체도 안된 상태로 만들어야 하는 것입니다.

그것과 마찬가지고 한 쓰레드가 동기화 블락안의 코드들을 실행하다가, 다른 쓰레드가 그 블락안에 진입해서 작업을 방해하게 되면 (메모리의 내용이 엉망이 되겠죠) 그러면 해당 작업은 실패하게 됩니다. 그리고 다시 해당 작업을 수행합니다.
그러면 다른 쓰레드의 간섭이 없을때 성공하게 되겠죠.

그런데 이 방식이 비효율성은 없나 하는 생각이 듭니다. 계속해서 다른 쓰레드가 간섭한다면 계속해서 다시 시도할텐데...
이 부분까지는 더 자세히 조사를 해보지 않아서 잘 모르겠습니다.

기존의 락을 거는 방식의 동기화가 유일한 것은 아니며, 이미 90년대부터 새로운 대안들이 많이 연구되고 있다고 합니다.
현재에 와서는 멀티코어, 멀티프로세서가 흔해지고 있기 때문에 이러한 병렬 프로그래밍 기법들은 계속해서 발전하고 현실화 될 것 같습니다.
그 중에서는 STM이 상당히 유력한 대안으로 거론되고 있나 봅니다. 뭐 여하튼 기존의 락을 거는 방식에 비하면 생각의 새로운 패러다임을 제시하는 방법인 것 같아서 좋아 보이는 방법입니다.

행복한 하루 되세요.