如何实现Java中的synchronized?

lydmc 2007-06-07 03:59:02
初看synchronized觉得像Windows的临界区。
但当它内部有Wait语句时:
进入synchronized的范围时,则获取了this在这个线程的锁定。
而再进入了Wait状态时,会释放this在这个线程的锁定。

这个就不同于Windows的临界区了,临界区是不会被自动退出的。

请各位指教。
...全文
394 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
healer_kx 2007-06-08
  • 打赏
  • 举报
回复
信号灯,临界区就是信号灯实现的,好像。
希望能启发你一下了。
lydmc 2007-06-07
  • 打赏
  • 举报
回复
可能我没有说清楚:
[java]
class A{
public synchronized foo(){
...
wait(); // 这里如果进入等待,则释放this在这个线程的锁定
...
}


[c++]
...
EnterCriticalSection(&m_lock);
...
WaitforSingleObject(...); // 这里如果进入等待,并不会释放m_lock在这个线程的锁定
...
LeaveCriticalSection(&m_lock);
...

c++怎样实现类似java中“进入等待,同时退出临界区”的效果?
healer_kx 2007-06-07
  • 打赏
  • 举报
回复
信我,没错的,有本书讲C#的线程安全,就是用这样的代码作为讲解的。
healer_kx 2007-06-07
  • 打赏
  • 举报
回复
很简单,
就是临界区。

但是出于Java的描述,它应该是一个对象聚合一个临界区。


class MyClass {


private:
CRITICAL_SECTION m_cs;

};

然后在你想要实现synchronized的方法里使用临界区就可以了。


我认为楼上的代码,把public继承改成protected继承,就是完美的实现方式了。
  • 打赏
  • 举报
回复
应该是这样的效果吧
仿照ATL中的东西
class MultiThreadLock
{
CRITICAL_SECTION m_lock;
protected:
typedef AutoLockT<MultiThreadLock> AutoLock;
public:
inline MultiThreadLock()
{
InitializeCriticalSection(&m_lock);
}
inline ~MultiThreadLock()
{
DeleteCriticalSection(&m_lock);
}
inline void Lock()
{
EnterCriticalSection(&m_lock);
}
inline void UnLock()
{
LeaveCriticalSection(&m_lock);
}
};
template<class T>
struct AutoLockT
{
inline AutoLockT(T* p):m_p(p)
{
m_p->Lock();
}
inline ~AutoLockT()
{
m_p->UnLock();
}
private:
T* m_p;
};


class test:public MultiThreadLock
{
typedef AutoLockT<test> AutoLock;
public:
void Do()
{
//do some ..
{
AutoLock lock(this);
//do some ..
}
//do some ..
}
};

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧