除了Synchronized,还有哪几种解决线程脏数据的高效率方法?

mjy120806132 2014-12-05 04:07:10
脏数据:线程不同步引起的数据异常,例子:在一个聊天室中,A和B恰好同时在聊天室发言,A和B发言在后台需要同时执行发言部门的函数,这时候有可能引发A发了B想要说的话,而B发了A想要说的话。
要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下:

public synchronized void run()
{

}

总结了synchronized的特点,如下:
1. synchronized关键字不能继承。
虽然可以使用synchronized来定义方法,但synchronized并不属于方法定义的一部分,因此,synchronized关键字不能被继 承。如果在父类中的某个方法使用了synchronized关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地 在子类的这个方法中加上synchronized关键字才可以。当然,还可以在子类方法中调用父类中相应的方法,这样虽然子类中的方法不是同步的,但子类 调用了父类的同步方法,因此,子类的方法也就相当于同步了。这两种方式的例子代码如下:
在子类方法中加上synchronized关键字

class Parent
{
public synchronized void method() { }
}
class Child extends Parent
{
public synchronized void method() { }
}
在子类方法中调用父类的同步方法

class Parent
{
public synchronized void method() { }
}
class Child extends Parent
{
public void method() { super.method(); }
}
2. 在定义接口方法时不能使用synchronized关键字。
3. 构造方法不能使用synchronized关键字,但可以使用下节要讨论的synchronized块来进行同步。
4. synchronized可以自由放置。


那么,问题来了,除了synchronized是一种简单能解决脏数据的方法,还有其它解决脏数据高效率的方法吗?
...全文
845 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zy_think123 2014-12-09
  • 打赏
  • 举报
回复
读写锁吧!还有有一个叫做什么生产者消费者的
wanghualeilei 2014-12-09
  • 打赏
  • 举报
回复
函数式编程 不留状态
  • 打赏
  • 举报
回复
排队发言
org_cy 2014-12-05
  • 打赏
  • 举报
回复
java.util.concurrent包下面有很多类都可以实现同步 Lock ReadWriteLock ReentrantLock CyclicBarrier Semaphore都可以的 还可以用wait notify
  • 打赏
  • 举报
回复
每个连接用户都拥有自己的部门发言方法,用对象去思考。
野树林 2014-12-05
  • 打赏
  • 举报
回复
lock,信号量机制

67,512

社区成员

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

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