`
ouyangfei0426
  • 浏览: 126968 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java多线程编程——锁

    博客分类:
  • java
阅读更多

    进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁。

    对代码进行同步控制我们可以选择同步方法,也可以选择同步块,这两种方式各有优缺点,至于具体选择什么方式,就见仁见智了,同步块不仅可以更加精确的控制对象锁,也就是控制锁的作用域,何谓锁的作用域?锁的作用域就是从锁被获取到其被释放的时间。而且可以选择要获取哪个对象的对象锁。但是如果在使用同步块机制时,如果使用过多的锁也会容易引起死锁问题,同时获取和释放所也有代价,而同步方法,它们所拥有的锁就是该方法所属的类的对象锁,换句话说,也就是this对象,而且锁的作用域也是整个方法,这可能导致其锁的作用域可能太大,也有可能引起死锁,同时因为可能包含了不需要进行同步的代码块在内,也会降低程序的运行效率。而不管是同步方法还是同步块,我们都不应该在他们的代码块内包含无限循环,如果代码内部要是有了无限循环,那么这个同步方法或者同步块在获取锁以后因为代码会一直不停的循环着运行下去,也就没有机会释放它所获取的锁,而其它等待这把锁的线程就永远无法获取这把锁,这就造成了一种死锁现象。

现在看看这两段代码的区别:

代码1

 

public void justTest(){
	while(true){
		synchronized(){
			...
		}
	}
}

 代码2

public void justTest(){
		synchronized(){
			while(true){
				...
			}
		}
}

 显然代码2的写法是不对的,它是的锁的作用域变为无限,该同步块一旦获得了锁就再也不会释放锁,很容易就造成了死锁。


    下面详细解说一下同步方法的锁,同步方法分为静态同步方法与非静态同步方法。

       所有的非静态同步方法用的都是同一把锁——实例对象本身,也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。

        而所有的静态同步方法用的也是同一把锁——类对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的。但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象!

    而对于同步块,由于其锁是可以选择的,所以只有使用同一把锁的同步块之间才有着竞态条件,这就得具体情况具体分析了,但这里有个需要注意的地方,同步块的锁是可以选择的,但是不是可以任意选择的!!!!这里必须要注意一个物理对象和一个引用对象的实例变量之间的区别!使用一个引用对象的实例变量作为锁并不是一个好的选择,因为同步块在执行过程中可能会改变它的值,其中就包括将其设置为null,而对一个null对象加锁会产生异常,并且对不同的对象加锁也违背了同步的初衷!这看起来是很清楚的,但是一个经常发生的错误就是选用了错误的锁对象,因此必须注意:同步是基于实际对象而不是对象引用的!多个变量可以引用同一个对象,变量也可以改变其值从而指向其他的对象,因此,当选择一个对象锁时,我们要根据实际对象而不是其引用来考虑!作为一个原则,不要选择一个可能会在锁的作用域中改变值的实例变量作为锁对象!!!!

分享到:
评论

相关推荐

    java上机报告5——Java的多线程编程1

    java上机报告5——Java的多线程编程1

    java多线程编程实战指南 核心篇 代码

    《Java多线程编程实战指南(核心篇)》以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及...

    java高级编程——多线程,输入输出流,网络编程

    java高级编程——对多线程,输入输出流,网络编程这三大块的深入讲解。

    java网络编程——网络版题库程序

    java网络编程——网络版题库程序(主要技术java+socket+多线程+mysql),程序是C/S 版本的,由于服务器端是java写的,所有客户端使用android也是很容易与服务器对接的

    Java——多线程编程技术.pdf

    Java——多线程编程技术.pdf

    java_多线程开发

    java_多线程开发 分为: 多线程编程——基础篇 多线程编程——实战篇

    Java多线程编程 线程同步机制.docx

    线程安全问题的产生是因为多个线程并发访问共享数据造成的,如果能将多个线程对共享数据的并发访问改为串行访问,即一个共享数据同一时刻只能被一个线程访问,就可以避免线程安全问题。锁正是基于这种思路实现的一种...

    《Java语言程序设计——基础篇》第三章选择作业答案.zip

    进阶篇主要介绍数据结构、高级GUI设计、多线程、集合架构、网络和Web程序设计、算法效率和排序、MVC,以及高级Java数据库程序设计等方面的内容,循序渐进,可读性强。《Java语言程序设计——基础篇》以示例讲解解决...

    《Android C++高级编程——使用NDK》_源码.zip

    主要内容:● 使用JNI将原生代码连接到Java中● 使用SWIG自动生成JNI代码● 使用POSIX线程实现多线程应用● 使用POSIX套接字实现网络应用● 使用logging、GDB和Eclipse调试器进行调试● 使用Valgrind分析内存● 使用...

    《Java语言程序设计——基础篇》第一章计算机、程序和Java概述作业答案.zip

    进阶篇主要介绍数据结构、高级GUI设计、多线程、集合架构、网络和Web程序设计、算法效率和排序、MVC,以及高级Java数据库程序设计等方面的内容,循序渐进,可读性强。《Java语言程序设计——基础篇》以示例讲解解决...

    java swing闹钟

    自己以前大二的时候闲暇时候写的,现在对以前的代码进行了整合,修复了部分bug以及资源占用过高,主要是因为当时对java多线程编程不是很熟悉。很实用的一个跨平台的闹钟程序,同时提供了较多的个性化定制属性,比如...

    《Java语言程序设计——基础篇》第三章选择示例.zip

    进阶篇主要介绍数据结构、高级GUI设计、多线程、集合架构、网络和Web程序设计、算法效率和排序、MVC,以及高级Java数据库程序设计等方面的内容,循序渐进,可读性强。《Java语言程序设计——基础篇》以示例讲解解决...

    《Java语言程序设计——基础篇》第五章方法示例.zip

    进阶篇主要介绍数据结构、高级GUI设计、多线程、集合架构、网络和Web程序设计、算法效率和排序、MVC,以及高级Java数据库程序设计等方面的内容,循序渐进,可读性强。《Java语言程序设计——基础篇》以示例讲解解决...

    《Java语言程序设计——基础篇》第四章循环示例.zip

    进阶篇主要介绍数据结构、高级GUI设计、多线程、集合架构、网络和Web程序设计、算法效率和排序、MVC,以及高级Java数据库程序设计等方面的内容,循序渐进,可读性强。《Java语言程序设计——基础篇》以示例讲解解决...

    《Java语言程序设计——基础篇》第二章基本程序设计示例.zip

    进阶篇主要介绍数据结构、高级GUI设计、多线程、集合架构、网络和Web程序设计、算法效率和排序、MVC,以及高级Java数据库程序设计等方面的内容,循序渐进,可读性强。《Java语言程序设计——基础篇》以示例讲解解决...

    Java并发编程之——Amino框架

    NULL 博文链接:https://m635674608.iteye.com/blog/2216723

    Java全能学习面试手册——Java面试题库.zip

    16 27道顶尖的Java多线程、锁、内存模型面试题!.pdf 17 29道常见的Spring面试题!.pdf 18 30个Java经典的集合面试题!.pdf 19 36道面试常问的MyBatis面试题!.pdf 20 40道常问的Java多线程面试题!.pdf 21 55道BAT...

    Java高手真经(编程基础卷)光盘全部源码 免积分

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...

    Java编程经典——2010新版Java教程

    第7章 异常、事件和多线程机制 第8章 输入输出技术 第9章 Java数据库技术 第10章 Java安全技术 第11章 Java网络技术(一) 第12章 Java网络技术(二) 第13章 Servlet技术 第14章 Java读写XML技术

    Java高手真经(编程基础卷)光盘全部源码

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16....

Global site tag (gtag.js) - Google Analytics