线程互斥,同步以及在java中的实现

zabaglione 2011-01-19 04:19:02
最近学习了多线程。对于线程的互斥,同步的概念,以及java中的实现有了点理解。
[概念]
临界区、互斥区、事件、信号量四种方式

基本上任何系统都用这四中方式来实现线程同步和互斥。
但是这些只是概念,具体到某些编程语言或者系统函数的时候
就会衍生出很多内容。比如windows API的实现,unix的系统函数实现等等

[Java的实现]
互斥:synchronized 关键字
同步:wait(),join(),notify()

以上是我个人的理解,如果有什么不对的地方,欢迎大家砖头。
...全文
582 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujiao827117 2011-01-24
  • 打赏
  • 举报
回复
同步是这个synchronized
O溺水的鱼0 2011-01-24
  • 打赏
  • 举报
回复
synchronized的使用参考我的博客示例:
http://blog.csdn.net/wgw335363240/archive/2010/08/08/5796955.aspx

wait和notify的使用参考博客网址:
http://blog.csdn.net/wgw335363240/archive/2010/06/26/5695432.aspx

这里面都有说明,建议楼主学习下,自己学完多写点例子,效果更好。
zabaglione 2011-01-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 whut_lcy 的回复:]

互斥、同步都是线程间通信的方式。线程间通信比进程间同步方便快速。这是因为线程间共享内存,往往一个变量就可以实现通信

进程间通信可用的方式比较少,它们彼此的内存不可见(OS保证)。往往只能借助第三方组件,如SOCKET等
[/Quote]
你的意思是说,
windows提供的那些互斥的api都是线程级别的了。
如果我想进程间怎么控制呢?sockt,lock file?
whut_lcy 2011-01-22
  • 打赏
  • 举报
回复
互斥、同步都是线程间通信的方式。线程间通信比进程间同步方便快速。这是因为线程间共享内存,往往一个变量就可以实现通信

进程间通信可用的方式比较少,它们彼此的内存不可见(OS保证)。往往只能借助第三方组件,如SOCKET等
zabaglione 2011-01-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bao110908 的回复:]

互斥是线程同步中的概念,而多个 JVM 则是多进程级别的。
[/Quote]
你说的没有错.但是我看很多资料上面都说,windows,unix下面都有
一些系统级别的api函数,这些函数实现进程级别的互斥,临界区访问等等。
c/c++很容易去使用他们,但是java如何使用呢这个不太清楚。
我看到java其实也有java.util.concurrent.locks.lock
这个是不是实现了进程级别的互斥呢。
SuperCodingMan 2011-01-21
  • 打赏
  • 举报
回复
线程是在同一个进程下的子任务,同一进程内的所有线程共享了这个进程所获得的资源(如内存),并且每个JVM都有自己的启动类加载器和命名空间,所以不同JVM里的线程应该是彼此不知道对方的存在的,不能造成相互之间的干扰,也就达不到同步。如果要在不同的JVM之间要达成交互,是否可以借鉴序列化和RMI的原理呢?

个人的一些理解,不知道对不对?
风过无痕1110 2011-01-21
  • 打赏
  • 举报
回复
这里正在进行科普,拿个板凳坐下
  • 打赏
  • 举报
回复
互斥是线程同步中的概念,而多个 JVM 则是多进程级别的。
zabaglione 2011-01-20
  • 打赏
  • 举报
回复
我看了一些资料,发现synchronized只是在同一个jvm中控制多线程
对于不同jvm之间的互斥操作没有很好的解决方案。
zabaglione 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bao110908 的回复:]
嗯,你说的是 Java 中关于线程经典的方式。

自 JDK 5 开始在 API 级别上增加了许多的同步器,比如:计数信号量(java.util.concurrent.Semaphore
)、倒计门闩(java.util.concurrent.CountDownLatch
)、循环障栅(java.util.concurrent.CyclicBarrier
)、交换器(java.util.……
[/Quote]
谢谢高手。学习了。
还有想问一下,所有的这些同步,互斥的原理都是针对同一个jvm中的多线程来说的,
如果是多个jvm,他们之间不可能用上面的理论进行互斥的。
这个理解对吗?
bjliuzg 2011-01-20
  • 打赏
  • 举报
回复
就和多条马路上有很多车辆一样。永远也不会有任何一条马路的汽车和另一条马路上的汽车碰撞。
  • 打赏
  • 举报
回复
嗯,你说的是 Java 中关于线程经典的方式。

自 JDK 5 开始在 API 级别上增加了许多的同步器,比如:计数信号量(java.util.concurrent.Semaphore
)、倒计门闩(java.util.concurrent.CountDownLatch
)、循环障栅(java.util.concurrent.CyclicBarrier
)、交换器(java.util.concurrent.Exchanger)等等,以及用于同步的锁,比如:可重入锁、可重入读写锁等。使用 CPU 上的 CAS 指令,在底层实现了无阻塞的原子计数操作。

tanrenzong1986 2011-01-19
  • 打赏
  • 举报
回复
使用Synchronized关键字。
mopishv0 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zabaglione 的回复:]

synchronized好像不能用在static的方法上面。
[/Quote]
可以用
zabaglione 2011-01-19
  • 打赏
  • 举报
回复
synchronized好像不能用在static的方法上面。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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