전에 한번 남들은 lock-free 어케 구현하고 있나 좀 나은 방법 있나 이래 저래 검색해봤더니...
아 글쎄 JAVA로 CAS 기반의 lock-free 구현을 하면서 ABA 드립을 치더라고?

도데체 JAVA로 왜 그런 시간낭비짓을 하는거임?
애초에 lock-free 는 임계영역 진입한 thread가 context-switching 당했을 때 대기중인 쓰레드의 대기시간이 길어지거나 스핀락이 스파이크 발생시키는 문제땜에 하는건데... 인터프리트어에서 왜 그런걸 신경쓰나? 그냥 임계영역만 좀 줄여도 될텐데...

그나마 c++ 로 CAS 기반 lock-free 구현해도 솔까말 critical section 건 것보다 더 느림.
그런데도 c++에서 성능 향상 봤다고 하는 새퀴들 보면 죄다 auto-lock class 쓰고 있더만?
로컬변수 생성자에서 락걸고 소멸자에서 락 풀고 ㅋㅋㅋ 미친 ㅋㅋㅋㅋ 도데체 그 미친짓 누가 시작했는지 쩝 ㅋ
예전에 하이텔 시절에도 누가 그짓 하면 편하다고 지껄이다 캐까였는데... 어째 10년이 지난 지금도 그 지랄들인지 ㅉ

MS 에서 구현해놓은 InterlockedPopEntrySList 도 디버그 걸고 디스어셈 들어가보면

7C932A8C   push        ebx
7C932A8D   push        ebp
7C932A8E   mov         ebp,ecx
7C932A90   mov         edx,dword ptr [ebp+4]
7C932A93   mov         eax,dword ptr [ebp]
7C932A96   or          eax,eax
7C932A98   je          7C932AA6
7C932A9A   lea         ecx,[edx-1]
7C932A9D   mov         ebx,dword ptr [eax]
7C932A9F   lock cmpxchg8b qword ptr [ebp]
7C932AA4   jne         7C932A96
7C932AA6   pop         ebp
7C932AA7   pop         ebx
7C932AA8   ret

이래놨는데.. 시발 루프 돌며 cas로 timestamp 써가며 주구장창 lock을 거니 저게 critical section보다 나은 퍼포먼스를 가질 턱볼리가 있나...
이건 뭐 pause 대신 lock# 유발하는 스핀락이니 대략...
뭐 그나마 옛날엔 저게 거의 표준적인 방법론이니까 대강 쓸 사람만 알아서 쓰라고 저따구로 구현해놨겠지 ㅋ

lock-free 제대로 구현하려면 CAS 가 아니라 put:get 을 n:1 로 만들고 put 이 tail 에 lock xchg 하던가, put:get 이 n:n이라면 2의 n승 크기의 queue 에 대한 index 를 lock xadd 하고 and mask 먹이는게.. 내 경험상으론 유일한 해법이더만.
그 짓 못하는 상황에선 그냥 context switching이 임계영역에서 안일어나길 빌면서 임계영역 최소화하고 critical section 쓰는게 낫더라고.

그나마 c++ 같은 바이너리 세계에서나 쓸모가 있지... 도데체 인터프리트어에선 왜 그런 짓을 하는건지...
인터프리트어가 정말로 그 자체로 돌아간다고 믿는건가...

그런게 정말로 JAVA 같은 인터프리트어에서 효과가 있긴 있는거임?