社区
Java SE
帖子详情
多线程中每个类都有一个锁吗?
ameyume
博客专家认证
2010-09-01 09:06:59
多线程同步除了使用Sleep外,还可以用wait,notify/notifyAll来实现同步。
那么,同一个类的多个对象不是每个对象都有一把锁,而是多个对象竞争同一把锁,这个没问题吧。
对于多个线程类,是不是每个类都有一把锁呢?
本人对于多线程的机制还是不很清楚。
有什么全面的例子可以联系下多线程?目前只做过生产者消费者的多线程处理。
...全文
428
21
打赏
收藏
多线程中每个类都有一个锁吗?
多线程同步除了使用Sleep外,还可以用wait,notify/notifyAll来实现同步。 那么,同一个类的多个对象不是每个对象都有一把锁,而是多个对象竞争同一把锁,这个没问题吧。 对于多个线程类,是不是每个类都有一把锁呢? 本人对于多线程的机制还是不很清楚。 有什么全面的例子可以联系下多线程?目前只做过生产者消费者的多线程处理。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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]
顶这个
每个对象都有一个叫做互斥锁标记的资源
多个线程申请一个对象的互斥锁标记,当一个线程获得后,就可以访问该对象,其他线程进入该对象的锁池进入阻塞状态,只有当互斥锁被释放后,其他线程才从阻塞状态回到就绪,重新争夺互斥锁标记
火龙果被占用了
2010-09-01
打赏
举报
回复
是谁跟你说的 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)
什么是
多线程
?如何实现
多线程
?
【转】什么是线程安全?怎么实现线程安全?什么是进程?什么是线程?...电脑
中
时会有很多单独运行的程序,
每个
程序有
一个
独立的进程,而进程之间是相互独立存在的。比如下图
中
的QQ、酷狗播放器、电脑...
C++线程
中
的几
类
锁
多线程
中
的
锁
主要有五
类
:互斥
锁
、条件
锁
、自旋
锁
、读写
锁
、递归
锁
。一般而言,所得功能与性能成反比。而且我们一般不使用递归
锁
(C++提供std::recursive_mutex),这里不做介绍。 互斥
锁
==互斥
锁
用于控制...
多线程
为什么要使用
锁
?
多线程
如何保证线程安全?
多线程
保证线程安全就是让多个线程执行的情况和单线程一样,读的时候是不影响线程安全的,但如果对数据操作,增加或者删除,几个线程同时...两者都是可重入
锁
:都是同
一个
线程进入会+1,直到为0才释放
锁
, 两者.....
QT
多线程
编程详解
一、线程基础 1、GUI线程与工作线程
每个
程序启动后拥有的第
一个
...
每个
线程都有自己的栈,因此
每个
线程都要自己的调用历史和本地变量。线程共享相同的地址空间。 二、QT
多线程
简介 QT通过三种形式提供了对线程...
Java
多线程
并发去调用
一个
类
的静态方法,会有问题吗?
总的结论:java是线程安全的,即对任何方法(包括静态方法)都可以不考虑线程冲突,但有
一个
前提,就是不能存在全局变量。如果存在全局变量,则需要使用同步机制。 如下通过一组对比例子从头讲解: 在
多线程
中
使用...
Java SE
62,614
社区成员
307,327
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章