首页  ·  知识 ·  编程语言
Java多线程锁如何进行数据同步共享
网友  中国IT实验室   Java  编辑:德仔   图片来源:网络
 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方法能够获得的对象级锁。
 
本文作者:网友 来源:中国IT实验室
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读