Java线程同步问题在实践中寻找答案

开发 后端
Java线程同步在不断的学习中有很多的问题需要注意。下面的文章希望大家在看完之后对于Java线程同步有所自己的见解。

Java线程同步需要我们不断的学习,在学习的时候我们会遇到不少的问题,其实我们在前面讲了为什么要Java线程同步,下面我们就来看如何才能线程同步。希望我们大家有所收获。

Java线程同步的基本实现思路还是比较容易理解的。我们可以给共享资源加一把锁,这把锁只有一把钥匙。哪个线程获取了这把钥匙,才有权利访问该共享资源。生活中,我们也可能会遇到这样的例子。一些超市的外面提供了一些自动储物箱。每个储物箱都有一把锁,一把钥匙。人们可以使用那些带有钥匙的储物箱,把东西放到储物箱里面,把储物箱锁上,然后把钥匙拿走。这样,该储物箱就被锁住了,其他人不能再访问这个储物箱。(当然,真实的储物箱钥匙是可以被人拿走复制的,所以不要把贵重物品放在超市的储物箱里面。于是很多超市都采用了电子密码锁。)

Java线程同步锁这个模型看起来很直观。但是,还有一个严峻的问题没有解决,这个同步锁应该加在哪里? 当然是加在共享资源上了。反应快的读者一定会抢先回答。#t#

没错,如果可能,我们当然尽量把同步锁加在共享资源上。一些比较完善的共享资源,比如,文件系统,数据库系统等,自身都提供了比较完善的同步锁机制。我们不用另外给这些资源加锁,这些资源自己就有锁。

但是,大部分情况下,我们在代码中访问的共享资源都是比较简单的共享对象。这些对象里面没有地方让我们加锁。读者可能会提出建议:为什么不在每一个对象内部都增加一个新的区域,专门用来加锁呢?这种设计理论上当然也是可行的。问题在于,Java线程同步的情况并不是很普遍。如果因为这小概率事件,在所有对象内部都开辟一块锁空间,将会带来极大的空间浪费。得不偿失。

于是,现代的编程语言的设计思路都是把同步锁加在代码段上。确切的说,是把同步锁加在“访问共享资源的代码段”上。这一点一定要记住,同步锁是加在代码段上的。

同步锁加在代码段上,就很好地解决了上述的空间浪费问题。但是却增加了模型的复杂度,也增加了我们的理解难度。现在我们就来仔细分析“同步锁加在代码段上”的Java线程同步模型。

首先,我们已经解决了同步锁加在哪里的问题。我们已经确定,同步锁不是加在共享资源上,而是加在访问共享资源的代码段上。

其次,我们要解决的问题是,我们应该在代码段上加什么样的锁。这个问题是重点中的重点。这是我们尤其要注意的问题:访问同一份共享资源的不同代码段,应该加上同一个同步锁;如果加的是不同的同步锁,那么根本就起不到同步的作用,没有任何意义。

这就是说,同步锁本身也一定是多个线程之间的共享对象。

 

责任编辑:张浩 来源: 博客园
相关推荐

2012-08-30 16:24:04

HTML5欧朋W3C

2022-11-26 00:02:00

优化器SQL语句

2012-02-24 09:49:21

虚拟化数据中心Citrix

2012-02-23 10:13:08

数据中心虚拟机管理负载均衡

2011-09-05 09:58:02

服务器存储虚拟化

2022-12-22 09:00:00

微服务架构

2020-07-29 07:48:55

数字孪生物联网IOT

2023-01-14 22:59:34

2017-06-21 14:16:56

编程程序员开发

2017-05-09 09:26:48

微服务消息推送

2023-12-06 15:21:16

Java云原生

2010-03-09 17:32:45

Python数组

2023-12-28 10:44:20

人工智能ChatGPT

2022-09-19 08:35:28

Kafka节点故障

2013-01-21 12:48:46

交互设计UI设计产品设计

2021-06-27 17:07:02

Snapchat QU网络协议网络

2021-06-03 08:32:52

KubernetesRBACRole

2023-05-31 08:37:06

Java并发编程

2020-09-22 20:00:30

微服务架构设计

2013-04-19 10:40:03

点赞
收藏

51CTO技术栈公众号