我们知道在多线程编程中,我们很大的一部分内容是为了解决线程间的资源同步问题和线程间共同协作解决问题。线程间的同步,通俗我们理解为僧多粥少,在粥有限情况下,我们怎么去防止大家有秩序的喝到粥,不至于哄抢都没得喝。线程讲协作,我们可以理解为我们在医院看病的时候,我们要先挂号,才能看病。现在医院有很多病人排队,怎么协调病人都有秩序的先挂号,后看病。本篇文章的重点不在此,也不是在此一下子能分析完,我们先从Java JVM的角度来理解多线程的一些方面。

  我们知道多线程间的数据同步,我们是通过加锁的操作来实现的。线程间的锁是怎么体现的?首先,我们看Java线程都需要对什么样的数据进行处理。我们顺便简单介绍下关于Java线程内存分配。

  首先,Java程序的数据分配的最小单位是进程,在进程里至少会有一个主线程,线程间是可以进行数据共享的。但是,我们的每个线程还有属于自己的线程栈,所以,Java线程不需要去考虑每个线程的私有线程栈里的私有数据。如:类的对象中非同步方法或者(代码块中定义的临时变量),他们在线程栈中分配内存,由于他们是方法中定义的临时变量,其他对象根本获得不了它的内存,所以,也就不用去考虑对这类数的同步。

  我们简单总结至少有以下两类数据在多个线程访问的时候,我们需要考虑数据同步:1.存在堆中的类的实例;2.类的方法作用域中的类变量。

  所以,我们的多个线程有可能会同时访问这两类数据的时候,我们需要给它们加上锁,先到先得的每次只准单一访问。通过学习我们知道,Java中的对象的锁是排他锁,每个类和对象都会有对应的锁。我们在平时编程中,常用触发锁的方式是通过互斥量的方式来同步共享资源,使得对代码块的访问每次都只允许一个对象访问。在Java语法中,我们至少有两种方式来同步代码块来对共享资源进行同步,如:synchronized 和ReentrantLock上锁的方式。

  关于Synchronized和ReenTrantLock的一点认识  

  关于synchronized 和ReentrantLock的性能讨论很多文章说法不一,有一种说法,JavaSE 的java.util.concurrent中ReentrantLock的设计就是对synchronized的替代方案,性能更好(http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html),也有一种说法,在JDK 1.6后,两个并没有性能的差别(《Java Concurrency In Pratice》)。但是有点,我们必须可以统一认识,使用ReetrantLock,在设计上弥补了synchronized存在的一些不足,至少在设计上有两点我们可以看出ReetrantLock对synchronized的改进:

  1.ReetrantLock能方便捕捉上锁的代码块的异常,代码如下:

Lock lock = new ReentrantLock();
...
lock.lock();
try {
// 对锁定对象进行更新等操作
} finally {
lock.unlock();
}

 2.ReetrantLock实现了中断的锁机制,synchronized加锁线程可能一直无限制的等待下去,就算那些正在占用资源的线程死锁了,正在等待的那些资源还是会继续等待,但是ReentrantLock可以选择放弃等待(该方法lockInterruptibly()的实现)。ReetrantLock应用可以举例说明:如果A、B2个线程去竞争锁,A线程得到了锁,B线程等待,但是A线程这个时候实在有太多事情要处理,就是一直不返回,B线程可能就会等不及了,想中断自己,不再等待这个锁了,转而处理其他事情。这个时候ReentrantLock就提供了2种机制,第一,B线程中断自己(或者别的线程中断它),但是ReentrantLock不去响应,继续让B线程等待,你再怎么中断,我全当耳边风(synchronized原语就是如此);第二,B线程中断自己(或者别的线程中断它),ReentrantLock处理了这个中断,并且不再等待这个锁的到来,完全放弃。  

Java多线程学习笔记——从Java JVM对多线程数据同步的一些理解的更多相关文章

  1. Java基础学习笔记一 Java介绍

    java语言概述 Java是sun公司开发的一门编程语言,目前被Oracle公司收购,编程语言就是用来编写软件的. Java的应用 开发QQ.迅雷程序(桌面应用软件) 淘宝.京东(互联网应用软件) 安 ...

  2. Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public vo ...

  3. Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类

    final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...

  4. Android(java)学习笔记15:匿名内部类实现多线程

    1. 使用匿名内部类实现多线程 二话不说,首先利用代码体现出来,给大家直观的感觉: package cn.itcast_11; /* 4 * 匿名内部类的格式: 5 * new 类名或者接口名() { ...

  5. Java基础学习笔记四 Java基础语法

    数组 数组的需求 现在需要统计某公司员工的工资情况,例如计算平均工资.最高工资等.假设该公司有50名员工,用前面所学的知识完成,那么程序首先需要声明50个变量来分别记住每位员工的工资,这样做会显得很麻 ...

  6. Android(java)学习笔记80:UDP协议发送数据

    UDP协议发送数据:我们总是先运行接收端,再运行发送端发送端: 1 package cn.itcast_02; import java.io.IOException; import java.net. ...

  7. Android(java)学习笔记211:采用httpclient提交数据(qq登录案例)

    1.Apache -Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包 ...

  8. Java基础学习笔记三 Java基础语法

    Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 ...

  9. Java基础学习笔记六 Java基础语法之类和ArrayList

    引用数据类型 引用数据类型分类,提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类.我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner ...

随机推荐

  1. What is WCF

    几个博客前,都是关于WCF零散的知识.要了解下下面的宏,什么是WCF? WCF:Windows Communication Foundation(WCF)框架. 1.WCF体系框架 2.框架分析 2. ...

  2. Windows在配置Python+tornado

    1,安装Python 2.7.x版本号 地址:https://www.python.org/downloads/release/python-278/ 2,安装python setuptools工具 ...

  3. NYOJ 904 search(stable_sort函数的应用)

    描述 游戏积分的排行榜出来了,小z想看看得某个积分的人是谁.但是由于人数很多,他自己找很浪费时间,所以他想请你帮忙写一个程序,能快速的帮他找到他想要找的人   输入 多组测试数据,第一行有一个数T,表 ...

  4. crawler_基础之_httpclient 访问网络资源

    先粘贴一个 简单版的,后期再修改 pom文件 <dependency> <groupId>org.apache.httpcomponents</groupId> & ...

  5. 关于”机器学习方法“,&quot;深度学习方法&quot;系列

    "机器学习/深度学习方法"系列,我本着开放与共享(open and share)的精神撰写,目的是让很多其它的人了解机器学习的概念,理解其原理,学会应用.如今网上各种技术类文章非常 ...

  6. c++使用stmp协议发送电子邮件(163邮箱,TTL非SSL)

    0.有关TLS和SSL SSL/TLS是用来加密邮件流的. 假设不加密的话非常easy被人破解. 只是既然是要发送广告邮件,这个就不用在意了,使用没加密的即可. 另外在使用的时候,发现,qq的邮箱须要 ...

  7. 【转】Appium基于安卓的各种FindElement的控件定位方法实践

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39754041#t11 AppiumDriver的各种findElement方法的尝试,尝试 ...

  8. HDU 1080 Human Gene Functions--DP--(变形最长公共子)

    意甲冠军:该基因序列的两端相匹配,四种不同的核苷酸TCGA有不同的分值匹配.例如T-G比分是-2,它也可以被加入到空格,空洞格并且还具有一个相应的核苷酸匹配分值,求最大比分 分析: 在空气中的困难格的 ...

  9. struts2 模型分配问题和延迟加载问题

    傅型号值问题: 首先须要说明的是:Action在请求到达ActionProxy时已经创建出来了,而且对应的创建了一个值栈. 在拦截器到达之前这个图片已经OK了.Action已经创建.并且压入了值栈vs ...

  10. asp.net webForm 前后台类关系

    要研究这个,首先要新建网站, protected void Page_Load(object sender, EventArgs e) { string str = System.Reflection ...