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

 

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

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

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

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

  1. class CopyMachine {  
  2. public synchronized void makeCopies(Document d, int nCopies) {  
  3. //only one thread executes this at a time  
  4. }  
  5. public void loadPaper() {  
  6. //multiple threads could access this at once!  
  7. synchronized(this) {  
  8. //only one thread accesses this at a time  
  9. //feel free to use shared resources, overwrite members, etc. 

Fine-grain Java多线程锁

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

  1. class FineGrainLock {  
  2. MyMemberClass x, y;  
  3. Object xlock = new Object(), ylock = new Object();  
  4. public void foo() {  
  5. synchronized(xlock) {  
  6. //access x here  
  7. }  
  8. //do something here – but don’t use shared resources  
  9. synchronized(ylock) {  
  10. //access y here  
  11. }  
  12. }  
  13. public void bar() {  
  14. synchronized(this) {  
  15. //access both x and y here  
  16. }  
  17. //do something here – but don’t use shared resources  
  18. }  

若为了在方法级上同步,不能将整个方法声明为synchronized关键字。它们使用的是成员Java多线程锁,而不是synchronized方法能够获得的对象级锁。

    原文作者:java锁
    原文地址: https://blog.csdn.net/barnett_zhubo/article/details/6859460
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞