如何构造一个线程安全的类

dahlwuyn 2014-04-18 09:34:27
我现在想构造这么一个类,这个类里边有一些状态量。类提供若干方法,这些方法有的会改变状态量,有的会查询状态,或者阻塞获取某些东西,还有的会终止这个类的使用。这些方法可能由其它若干线程并行执行,如何设计这个类,来保证这些方法准确工作,而且不会导致状态的不一致?
...全文
304 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dahlwuyn 2014-04-19
  • 打赏
  • 举报
回复
我现在已经解决这个问题了,取消阻塞方法。定义一个回调类,包含若干类状态变化时可执行的方法,这样就可以在类状态变化的时候及时响应,而且不会有线程同步的复杂问题了
dahlwuyn 2014-04-18
  • 打赏
  • 举报
回复
引用 5 楼 u010479715 的回复:
锁住你要更新的状态,保证这个状态的实例唯一
不能一直锁定这个对象,有些方法会执行很久,那这个过程中其它线程没法调用其它方法了
dahlwuyn 2014-04-18
  • 打赏
  • 举报
回复
引用 4 楼 u013266090 的回复:
引用 3 楼 hjw506848887 的回复:
snycrinized(好像不是这么拼写的。。。),简单的就用这个。。。
synchronized 具体用法CSDN有详细介绍!
如果状态只有一个,用这个当然也就够了,但是这里会有多个状态,而且相互之间会有影响,单独修改一个状态,可以保证该状态没错,但是整体的状态可能就错了
dahlwuyn 2014-04-18
  • 打赏
  • 举报
回复
引用 2 楼 yyfhz 的回复:
把这些类所有可公开的方法都加上同步关键字,这还不够,外部调用的地方要随时记得,在2次调用之间类的内部变量可能已经发生了变化
对于阻塞的方法加同步关键字,结果就是它把这个对象锁定了,其它方法没法调用了
ilmlife 2014-04-18
  • 打赏
  • 举报
回复
锁住你要更新的状态,保证这个状态的实例唯一
  • 打赏
  • 举报
回复
引用 3 楼 hjw506848887 的回复:
snycrinized(好像不是这么拼写的。。。),简单的就用这个。。。
synchronized 具体用法CSDN有详细介绍!
  • 打赏
  • 举报
回复
snycrinized(好像不是这么拼写的。。。),简单的就用这个。。。
yyfhz 2014-04-18
  • 打赏
  • 举报
回复
把这些类所有可公开的方法都加上同步关键字,这还不够,外部调用的地方要随时记得,在2次调用之间类的内部变量可能已经发生了变化
jsshizhanab 2014-04-18
  • 打赏
  • 举报
回复
加类锁不就可以了么?
  • 打赏
  • 举报
回复
具体的类具体分析才行,而不是一概而论的都加锁!
  • 打赏
  • 举报
回复
Collections.synchronizedList(list) Collections.synchronizedSet(s) Collections.synchronizedMap(m)
yyfhz 2014-04-18
  • 打赏
  • 举报
回复
但是至少可以把独立性强的部分分离出去。 如果所有的操作之间都有着强关联性,那么只好接受经常性Block的现状。
dahlwuyn 2014-04-18
  • 打赏
  • 举报
回复
引用 11 楼 yyfhz 的回复:
引用 6 楼 dahlwuyn 的回复:
[quote=引用 2 楼 yyfhz 的回复:] 把这些类所有可公开的方法都加上同步关键字,这还不够,外部调用的地方要随时记得,在2次调用之间类的内部变量可能已经发生了变化
对于阻塞的方法加同步关键字,结果就是它把这个对象锁定了,其它方法没法调用了
如果嫌同步性不够,可以把这个类拆分成几个,这样影响就少了。 或者,可以用代码级别的同步关键字,对有关联关系的代码块用相同的锁对象。 [/quote]类拆成几个?用多个类代替这一个类?这好像没有减少它们本身内部的联系吧
yyfhz 2014-04-18
  • 打赏
  • 举报
回复
引用 6 楼 dahlwuyn 的回复:
引用 2 楼 yyfhz 的回复:
把这些类所有可公开的方法都加上同步关键字,这还不够,外部调用的地方要随时记得,在2次调用之间类的内部变量可能已经发生了变化
对于阻塞的方法加同步关键字,结果就是它把这个对象锁定了,其它方法没法调用了
如果嫌同步性不够,可以把这个类拆分成几个,这样影响就少了。 或者,可以用代码级别的同步关键字,对有关联关系的代码块用相同的锁对象。
Fantastic99 2014-04-18
  • 打赏
  • 举报
回复
这个类用Singleton 它的method用synchronized 或这个类的实例直接就是带锁的

62,614

社区成员

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

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