多线程中每个类都有一个锁吗?

ameyume
博客专家认证
2010-09-01 09:06:59
多线程同步除了使用Sleep外,还可以用wait,notify/notifyAll来实现同步。
那么,同一个类的多个对象不是每个对象都有一把锁,而是多个对象竞争同一把锁,这个没问题吧。
对于多个线程类,是不是每个类都有一把锁呢?
本人对于多线程的机制还是不很清楚。
有什么全面的例子可以联系下多线程?目前只做过生产者消费者的多线程处理。
...全文
428 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainsilence 2010-09-02
  • 打赏
  • 举报
回复
同步主要是为了解决多线程访问的情况下,出现读到脏数据的情况

除了synchronized,wait,notify能达到此功能之外
还有volatile关键字

在Java1.2之后,又有ThreadLocal用于隔离不同线程,属于不同类型的同步吧。

现在Java7之后,又有fork in机制。
kahnnash 2010-09-02
  • 打赏
  • 举报
回复
是控制线程的几种方法 不是同步

设置优先级
sleep
yield
join

同步用synchronized
shehun 2010-09-02
  • 打赏
  • 举报
回复
对于同一个类的多个对象,每个对象都有一把锁。

锁可以是object级别的,也可以是class级别的。
Mybeautiful 2010-09-02
  • 打赏
  • 举报
回复
我认为楼主走入锁的泥塘了。

不要去考虑是不是每个对象有把锁,类是不是有把锁等定。

这样想,
1.任何对象都可以做锁。
2.对于有用synchronized的地方,分析清楚他用的是什么作为锁。
如静态方法 前加 synchronized, 锁是什么? 是该类对应的class对象。
非静态方法呢? 是当前对象。
synchronized 代码块呢? 是你指定的那个对象。


把这两点搞清楚了,这个锁的问题就豁然开朗了。
sky123123 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bao110908 的回复:]
是谁跟你说的 sleep 可以实现同步?
[/Quote]


嘿嘿。。。
ameyume 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 liuyiwu 的回复:]
引用 7 楼 ameyume 的回复:
那就是说每个对象都有一把锁,但都可以用自己的锁把多个对象共享的变量(假设有个变量时共享的)锁定,一旦锁定,别的对象就不能获得对这个共享变量的修改权了.可以这样理解吧?


多个线程竞争的其实是锁。你可以用某个对象的隐式锁(称L)把某段代码“锁住”。一个线程首先进入这段代码后,这个线程就独占这个锁L,其他线程只有等这个线程执行完这段被锁代码,释放锁L后……
[/Quote]
多谢!!
那我看看,好好研究清楚。
yangjie19880826 2010-09-02
  • 打赏
  • 举报
回复
哥们,sleep应该是不能实现同步吧,比如说sleep(1000),这并不是一秒,要根据倒是系统线程与进程的运行状况来判定,有可能小于一秒,也可能大于一秒!!!
liuyiwu 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ameyume 的回复:]
那就是说每个对象都有一把锁,但都可以用自己的锁把多个对象共享的变量(假设有个变量时共享的)锁定,一旦锁定,别的对象就不能获得对这个共享变量的修改权了.可以这样理解吧?
[/Quote]

多个线程竞争的其实是锁。你可以用某个对象的隐式锁(称L)把某段代码“锁住”。一个线程首先进入这段代码后,这个线程就独占这个锁L,其他线程只有等这个线程执行完这段被锁代码,释放锁L后才能再去竞争锁L,从而进入这段代码。

至于notify是跟对象的隐式条件有关,你可以去看一下《java核心技术》的线程那一章,它将的蛮清楚的。在java5里好像还出现了单独的锁对象和条件对象。顺便提一下,我看的是java5的黄底红字第7版。
Mybeautiful 2010-09-02
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 shehun 的回复:]

对于同一个类的多个对象,每个对象都有一把锁。

锁可以是object级别的,也可以是class级别的。
[/Quote]

不要说锁是什么级别的,你的意思准确说是这样:
锁可以是object级别的 ---》非静态方法呢? 是当前对象。
class级别的---》 如静态方法 前加 synchronized, 锁是什么? 是该类对应的class对象。




锁无级别,就是看你用谁做锁。
ameyume 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ameyume 的回复:]
引用 9 楼 bao110908 的回复:
是谁跟你说的 sleep 可以实现同步?

百度了一下,
看到有人这么回答,看来真是尽信书不如无书啊,何况是baidu呢

线程同步有几种方法??
http://zhidao.baidu.com/question/15390715.html?fr=ala0
[/Quote]
也就是说sleelp只起到睡眠等待的作用,并不能使线程同步?
ameyume 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bao110908 的回复:]
是谁跟你说的 sleep 可以实现同步?
[/Quote]
百度了一下,
看到有人这么回答,看来真是尽信书不如无书啊,何况是baidu呢

线程同步有几种方法??
http://zhidao.baidu.com/question/15390715.html?fr=ala0
kahnnash 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yktd26 的回复:]

每个对象一把锁,如果线程同步,那么当一个线程获得锁并没有放弃之前,其他线程不能获得这个对象的访问权

锁是用来避免多个线程异步(同时)访问一个对象的
[/Quote]
顶这个

每个对象都有一个叫做互斥锁标记的资源
多个线程申请一个对象的互斥锁标记,当一个线程获得后,就可以访问该对象,其他线程进入该对象的锁池进入阻塞状态,只有当互斥锁被释放后,其他线程才从阻塞状态回到就绪,重新争夺互斥锁标记
  • 打赏
  • 举报
回复
是谁跟你说的 sleep 可以实现同步?
yktd26 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ameyume 的回复:]
那就是说每个对象都有一把锁,但都可以用自己的锁把多个对象共享的变量(假设有个变量时共享的)锁定,一旦锁定,别的对象就不能获得对这个共享变量的修改权了.可以这样理解吧?
[/Quote]
每个对象一把锁,如果线程同步,那么当一个线程获得锁并没有放弃之前,其他线程不能获得这个对象的访问权

锁是用来避免多个线程异步(同时)访问一个对象的
ameyume 2010-09-01
  • 打赏
  • 举报
回复
那就是说每个对象都有一把锁,但都可以用自己的锁把多个对象共享的变量(假设有个变量时共享的)锁定,一旦锁定,别的对象就不能获得对这个共享变量的修改权了.可以这样理解吧?
NetMatrix 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cooljia 的回复:]
恭喜你答错了,对于同一个类的多个对象,每个对象都有一把锁。

锁可以是object级别的,也可以是class级别的。
[/Quote]
同意!
macrotea-cn 2010-09-01
  • 打赏
  • 举报
回复
学习!!!
zhouzheng51 2010-09-01
  • 打赏
  • 举报
回复
每一个线程争一把锁
也就是锁是单独的
maquan 2010-09-01
  • 打赏
  • 举报
回复
在 Java 的世界里,每个对象实例本身都是一把锁,包括一个 Class 对象(就是1楼说的class级别)。

■□■□■□■□■□■□■□■
□             □
■  忍以明志 勤以致远  ■
□             □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
blliy117 2010-09-01
  • 打赏
  • 举报
回复
多个线程同时竟争资源(如执行某段代码中有共享变量),才会需要锁,线程之间要竟争的是这把锁。

对象都有一把锁,你可以N把,对象不一定需要锁,如果没有竟争,何必用锁,如果有竟争,每个对象有自己的锁那这样就没有竟争的概念了。
所以共享的时候锁是同一把才有效。
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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