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

java多线程编程——锁

    博客分类:
  • java
阅读更多

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

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

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

代码1

 

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

 代码2

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

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


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

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

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

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

分享到:
评论

相关推荐

    多线程编程——实战篇

    接下来我们将通过一个具体的例子——“厨师-食客”模式来深入理解多线程编程的实际应用。 1. **模型介绍**: - 生产者(厨师):负责制作食物,并将其放入共享的“仓库”(桌子)。 - 消费者(食客):从“仓库”...

    java多线程教程——一个课件彻底搞清多线程

    死锁是多线程编程中可能出现的问题,当两个或多个线程互相等待对方释放资源,形成循环等待,导致都无法继续执行,就出现了死锁。避免死锁的关键在于正确设计资源获取顺序和避免持有资源请求新资源。 Java的线程调度...

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

    Java 多线程编程应用场景 —— 电影院售票系统设计 本资源摘要信息将对 Java 多线程编程在电影院售票系统设计中的应用进行详细介绍。该系统模拟了电影院三个售票窗口同时出售电影票的过程,通过 Java 多线程编程...

    java多线程案例——未完成

    Java多线程是Java编程中的一个重要领域,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在这个未完成的案例中,我们可能正在探讨如何在Java中创建和管理线程,以及处理多线程环境下的并发问题。下面是...

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

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

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

    "Java多线程编程技术.pdf" Java多线程编程技术是Java平台的一个重要技术优势,是第一个直接把跨平台线程模型和标准的内存模型集成到语言中的主流语言。多线程编程技术是Java平台的一个重要技术优势,它可以使程序的...

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

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

    Java多线程编程详解

    ### Java多线程编程详解:深入理解与实践 #### 一、理解多线程机制 多线程,作为现代编程语言的重要特性之一,允许在单一应用程序内并发执行多个任务,从而极大提升了程序的效率和响应速度。在Java中,多线程的...

    Java多线程编程

    ### Java多线程编程知识点详解 #### 一、线程基础概述 - **定义与特点:** - **线程**是一种比进程更细粒度的执行单元,它允许在一个进程中并发执行多个任务。 - **轻量级进程**:线程有时被称为轻量级进程,...

    java编程——Java线程

    ### Java线程详解 #### 线程概念与重要性 Java线程是Java编程语言中用于实现并发处理的关键机制之一...通过深入学习Java线程的理论和实践,开发者可以充分利用多线程的优势,构建出高性能、高响应性的Java应用程序。

    Java多线程——线程八锁案例分析.docx

    在Java多线程编程中,线程安全是一个关键概念,特别是在并发访问共享资源时。"线程八锁案例分析"文档中的示例着重展示了`synchronized`关键字如何在控制线程同步方面发挥作用。以下是对这些案例的详细分析: 案例1...

    java 多线程编程 月食效果

    总结,"java 多线程编程 月食效果"是一个结合了Java多线程、图形编程和天文学知识的项目,它不仅要求开发者具备扎实的编程基础,还需要有良好的问题建模能力和创新思维。通过这个项目,开发者可以提升在并发编程和...

    java多线程编程技术

    Java多线程编程技术 Java多线程编程技术是Java编程语言中的一项高级技术,其主要目的是让开发者能够编写出能够同时执行多个操作的程序,以提高程序的执行效率和响应性。在多核处理器日益普及的今天,合理运用多线程...

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

    在这个"java网络编程——网络版题库程序"中,我们可以深入探讨几个关键的技术元素:Java Socket、多线程以及MySQL数据库的集成。 首先,Java Socket是Java API提供的网络通信基础,允许两台机器上的应用程序通过TCP...

    Java多线程技术及其在网络编程中的应用.pdf

    ### Java多线程技术及其在网络编程中的应用 #### 引言 Java作为一种强大的面向对象的编程语言,由SUN公司开发,旨在支持分布式计算。它不仅具备简单的语法、面向对象的特点,还拥有跨平台的特性、高可靠性和安全性...

    《软件开发基础(Java)》实验报告-Java多线程编程.docx

    在本实验报告中,我们关注的是Java多线程编程,这是Java编程中一个重要的主题,尤其是在并发处理和高性能系统设计中。线程是操作系统分配CPU时间的基本单位,它允许一个程序内部同时执行多个任务,提高了应用程序的...

    Java多线程的小例子——吃包子

    这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...

    java多线程编程笔记

    【Java多线程编程笔记】 Java 多线程编程是Java开发中不可或缺的一部分,它允许程序同时执行多个任务,提高程序的效率和响应性。在深入理解Java多线程之前,我们首先要理解操作系统中的基本概念——进程和线程。 1...

    JAVA多线程编程案例_火车站售票系统

    ### JAVA多线程编程案例——火车站售票系统 #### 概述 本文档通过设计一个简单的Java多线程机制实现了一个火车站售票系统的模拟程序。该系统主要用于演示如何在Java中使用多线程技术来处理并发访问资源的问题,并...

    并发编程——认识java里的线程(csdn)————程序.pdf

    并发编程——认识 Java 里面的线程 在 Java 编程中,并发编程是一个非常重要的概念。Java 程序天生就是多线程的,main 方法开始执行后,按照既定的代码逻辑执行,看似没有其他线程参与,但实际上 Java 程序天生就是...

Global site tag (gtag.js) - Google Analytics