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

开发 后端
Java多线程锁需要我们大家详细的学习一下,在数据安全方面Java多线程锁就是一个相当重要的技术语法。希望大家详细学习。

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

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

给共享变量上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方法能够获得的对象级锁。

 

责任编辑:张浩 来源: CSDN
相关推荐

2010-03-17 18:21:54

Java多线程静态数据

2010-03-16 15:32:26

2011-05-25 00:00:00

数据库设计

2010-03-16 13:47:48

Java多线程服务器

2020-04-30 10:09:23

数字资产管理DAM数字资产

2010-02-02 10:04:58

2022-05-25 15:33:27

区块链加密货币

2009-09-10 23:17:33

ASP.NET Eva

2017-03-07 10:37:05

非数据数据分析

2021-07-28 15:44:52

Java开发数据库

2021-05-26 10:12:07

数字化转型IT领导者

2015-04-21 14:21:07

大数据数据分析

2010-02-01 17:33:24

Python主线程

2021-12-14 22:12:30

云计算云存储IT

2015-06-09 16:22:05

数据中心

2009-03-24 08:56:23

数据同步多线程Java

2010-02-02 16:47:12

Python主线程

2024-06-28 08:45:58

2024-01-05 15:28:06

鸿蒙数据同步GlobalThis

2022-08-17 06:25:19

伪共享多线程
点赞
收藏

51CTO技术栈公众号