Java多线程锁如何进行数据同步共享

发表于:2010-9-21 10:34

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
Java
#
java

  Java多线程锁是为了解决数据同步中的数据安全问题,下面我们就来详细的学习下有关于Java多线程锁的相关问题。只有不断的学习才能不断的提高自身的相关技术。

  大多数应用程序要求线程互相通信来同步它们的动作。在Java程序中最简单实现同步的方法就是上Java多线程锁。为了防止同时访问共享资源,线程在使用资源的前后可以给该资源上锁和开锁。假想给复印机上锁,任一时刻只有一个职员拥有钥匙。若没有钥匙就不能使用复印机。

  给共享变量上Java多线程锁就使得Java线程能够快速方便地通信和同步。某个线程若给一个对象上了锁,就可以知道没有其他线程能够访问该对象。即使在抢占式模型中,其他线程也不能够访问此对象,直到上锁的线程被唤醒、完成工作并开锁。那些试图访问一个上锁对象的线程通常会进入睡眠状态,直到上锁的线程开锁。一旦锁被打开,这些睡眠进程就会被唤醒并移到准备就绪队列中。

  在Java编程中,所有的对象都有锁。线程可以使用synchronized关键字来获得锁。在任一时刻对于给定的类的实例,方法或同步的代码块只能被一个线程执行。这是因为代码在执行之前要求获得对象的Java多线程锁。继续我们关于复印机的比喻,为了避免复印冲突,我们可以简单地对复印资源实行同步。如同下列的代码例子,任一时刻只允许一位职员使用复印资源。通过使用方法(在 Copier 对象中)来修改复印机状态。这个方法就是同步方法。只有一个线程能够执行一个Copier对象中同步代码,因此那些需要使用Copier对象的职员就必须排队等候。

class CopyMachine { 
public synchronized void makeCopies(Document d, int nCopies) { 
//only one thread executes this at a time 

public void loadPaper() { 
//multiple threads could access this at once! 
synchronized(this) { 
//only one thread accesses this at a time 
//feel free to use shared resources, overwrite members, etc.

  Fine-grain Java多线程锁

  在对象级使用锁通常是一种比较粗糙的方法。为什么要将整个对象都上锁,而不允许其他线程短暂地使用对象中其他同步方法来访问共享资源?如果一个对象拥有多个资源,就不需要只为了让一个线程使用其中一部分资源,就将所有线程都锁在外面。由于每个对象都有Java多线程锁,可以如下所示使用虚拟对象来上锁:

class FineGrainLock { 
MyMemberClass x, y; 
Object xlock = new Object(), ylock = new Object(); 
public void foo() { 
synchronized(xlock) { 
//access x here 

//do something here - but don't use shared resources 
synchronized(ylock) { 
//access y here 


public void bar() { 
synchronized(this) { 
//access both x and y here 

//do something here - but don't use shared resources 

}

  若为了在方法级上同步,不能将整个方法声明为synchronized关键字。它们使用的是成员Java多线程锁,而不是synchronized方法能够获得的对象级锁。
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • fengzi2009F
    2010-9-25 20:51:07

    好好学习java多线程

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号