`
Hyj_Sh
  • 浏览: 969 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于多线程的一个面试题,欢迎大家来讨论

阅读更多
一个被锁的老帖
===========================================================================
下面的代码在绝大部分时间内都运行得很正常,请问在什么情况下会出现问题?问题的根源在哪里?
package com.heyongjin.test;

import java.util.LinkedList;

public class Stack {

	LinkedList list = new LinkedList();

	public synchronized void push(Object x) {
		synchronized (list) {
			list.addLast(x);
			notify();
		}
	}

	public synchronized Object pop() throws Exception {  
		synchronized (list) {
			if (list.size() <= 0) {
				wait();
			}
			return list.removeLast();
		}
	}
}


答:这里有可能会死锁:当外界调用pop(),但堆栈中没有元素,即list.size() <= 0,Stack进入停滞状态(wait())(注意此时list被锁定了 ,但Stack不会被锁定),此时外界仍然可以进入push()(因为wait()不会锁定Stack),但此时在push()中调用list.addLast()时,因为list 被锁定,所以无法调用。
==================================================================
答案又了,但是怎么修改程序才能避免死锁呢??
分享到:
评论
10 楼 kevin2003sk 2011-02-10  
好垃圾的多线程实现啊。list上的synchrionized根本没有必要,因为锁已经加在this上了。

造成死锁的原因就是:wait()实质上是this.wait(), list上的锁根本没有释放,所以在push()方法中的synchrinozed(list)根本进不去。

如何修改:
1. 把两个方法上的synchronized都去掉。
2. notify和wait改成list.notify()和list.wait().
3. pop()方法改成:
public Object pop(){
   while(true){
      synchronized(list){
         if( list.size()==0)
            list.wait();
         else
            return list.removelast();
      }
   }
}
9 楼 Turbo 2011-02-09  
生活小丑 写道
whiletrue 写道
list都空了,为什么还要wait?

同问

应该是pop方法的目的是要返回一个非空的元素,所以空的时候就要等待。
8 楼 抛出异常的爱 2011-02-08  
双锁......
有两个锁对像时就有可能死锁

把锁对像变成同一个就可以避免双锁.
7 楼 tian-84 2011-02-06  
把空的判断挪到锁定对象的代码外面来
public synchronized Object pop() throws Exception { 
       if (list.size() <= 0) {   
                wait();   
       } else {    
       synchronized (list) {           
            return list.removeLast();   
       }   
       }
} 

6 楼 心神不宁 2011-02-05  
Thinking in java 好像有,是wait和notify那一节吧
package com.heyongjin.test;

import java.util.LinkedList;

public class Stack {

	LinkedList list = new LinkedList();

	public void push(Object x) {
		synchronized (list) {
			list.addLast(x);
			list.notifyAll();
		}
	}

	public Object pop() throws Exception {  
		synchronized (list) {
			while(list.size() <= 0) {
				list.wait();
			}
			return list.removeLast();
		}
	}
}


不过用while会多判断一次吧
这样也可以
public Object pop() throws Exception {  
	synchronized (list) {
                Object result= null;
		if(list.size() >0) {
		     result= list.removeLast();

		}else{
		     list.wait();
                }
                return result;
	}
}



5 楼 SINCE1978 2011-02-04  
一个丑陋的类
4 楼 生活小丑 2011-02-03  
whiletrue 写道
list都空了,为什么还要wait?

同问
3 楼 whiletrue 2011-02-03  
list都空了,为什么还要wait?
2 楼 DonnyZXT 2011-01-31  
楼上正解,类外线程锁this,类内线程锁list
1 楼 kaneg 2011-01-31  
为什么方法已经同步了,还要再同步list呢?去掉其中一个即可

相关推荐

    java面试题,技术面试与设计模式

    Java作为世界上最受欢迎的编程语言之一,其面试题和设计模式是每位Java开发者都需要掌握的核心知识。下面我们将深入探讨这些主题,以帮助IT工作者在面试中脱颖而出,并提升自己的技术水平。 一、Java面试题 1. ...

    java英语面试题汇总

    在Java软件开发领域,英语面试...同时,对于技术问题,面试官可能还会询问关于多线程、异常处理、集合框架、设计模式、数据库操作等方面的内容。熟悉这些核心概念,并能用英语流畅地表达,将有助于你在面试中脱颖而出。

    大公司JAVA面试试题

    面试是评估一个开发者技能的关键环节,对于大公司的Java面试,通常会涵盖广泛的知识点,包括基础语法、面向对象编程、集合框架、多线程、异常处理、IO流、网络编程、设计模式、JVM内存管理、数据库操作、算法与数据...

    Java面试题笔试题大全

    5. **多线程**:Java提供了内置的线程支持,面试中可能讨论线程同步(如synchronized关键字、wait()、notify())、线程池、并发工具类(如ExecutorService、Semaphore、CyclicBarrier)等。 6. **内存管理与垃圾...

    最全Java面试题汇总

    Java作为世界上最受欢迎的编程语言之一,其面试题的深度和广度都反映了应聘者对语言的理解和实际应用能力。这份“最全Java面试题汇总”无疑是准备Java面试者的宝贵资源。下面,我们将根据标题和描述,结合三个压缩...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    180多页面试题,前前后后不间断的更新了两年,准备换工作时,总是拿来看看,有比较好的面试题,也不间断的更新,面试题目录如下: 【基础】面向对象的特征有哪些方面 13 抽象 13 继承 13 封装 13 多态性 13 【基础】...

    java面试题汇总,自己总结的

    Java作为世界上最受欢迎的编程语言之一,其面试题涵盖了广泛的领域,包括基础知识、数据结构与算法、多线程、网络编程、I/O、JVM、设计模式等。以下是一些基于标题和描述中提及的Java面试知识点的详细说明: 1. **...

    Java基础面试题大全

    这份"Java基础面试题大全"涵盖了从语法、面向对象编程、集合框架到异常处理、多线程、IO流等Java核心领域的常见面试问题。以下是这些知识点的详细说明: 1. **Java语法基础**:包括变量、数据类型、运算符、流程...

    java面试题(压缩包内全包为pdf格式的文件)

    本压缩包中的资料丰富多样,包括了Java基础、JSP、代码编程题、线程编程、EJB(Enterprise JavaBeans)以及数据库相关的面试题,对求职者来说具有极高的参考价值。 首先,Java基础方面是面试的必考项,涵盖了Java...

    java经典面试题

    这里我们将深入探讨一些Java经典面试题,帮助求职者或开发者更好地准备面试。 1. **Java基础** - **数据类型**:Java有两大类数据类型——基本类型和引用类型。了解它们的区别,例如int与Integer。 - **对象生命...

    Java 面试题合集,欢迎提交 Issue 补充~ .zip

    Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 数据库相关:包括关系型数据库和非关系型数据库的使用,以及JDBC、MyBatis等...

    Java面试题

    Java作为世界上最受欢迎的编程语言之一,其面试题涵盖了广泛的领域,包括基础知识、数据结构与算法、多线程、网络编程、异常处理、集合框架、IO流、反射、设计模式、JVM内存管理以及框架应用等多个方面。下面我们将...

    java部分面试题答案.7z

    这份“java部分面试题答案.7z”压缩包文件包含了多个关键领域的面试专题及其答案,涵盖了从基础到高级的Java技术,包括并发编程、消息中间件、Spring框架、分布式协调服务Zookeeper、微服务Spring Cloud、垃圾收集器...

    Java经典面试50题

    每个主题下都包含一系列具体问题,例如在多线程中,可能问到死锁的条件和避免方法;在集合框架中,可能会讨论ArrayList和LinkedList的性能差异;在JVM部分,可能会探讨堆内存的分区和垃圾收集算法。理解并能熟练应用...

    Mysql基础面试题及解答

    2. **MySQL的技术特点**:MySQL是一个多线程、支持多种客户端的SQL服务器,包括不同的后台、API接口和管理工具。它强调高性能、高可靠性、易于使用和开源。 3. **Heap表**:Heap表是一种内存中的临时表,适用于快速...

    【Java核心知识面试】-各大公司Java后端开发面试题总结.zip

    这份"【Java核心知识面试】-各大公司Java后端开发面试题总结.zip"文件显然是一份宝贵的资源,它涵盖了Java后端开发面试中常被问到的核心知识点。以下是对这些知识点的详细解释: 1. **基础语法**:包括类、对象、...

    Java面试题2023最新整理二期.zip

    这份"Java面试题2023最新整理二期"的压缩文件显然包含了今年最热门、最重要的Java技术面试知识点。以下是对这些知识点的详细解读: 1. **基础语法**:这是每个Java开发者都必须掌握的,包括但不限于变量、数据类型...

    c/c++ 经典笔试题

    7. **C专家编程**:这本书名暗示了一个关于C编程的深入指南,可能涵盖了高级主题,如位操作、模板、内存优化和错误处理策略,对提升C编程技能非常有帮助。 8. **46家公司笔试面试题、c语言面试题,c++面试题下载**:...

    Python程序员面试题 你必须提前准备!(答案及解析)

    如对答案有疑问,欢迎留言讨论。 小编将这些面试问题大致分为四类: 什么(what)?如何做(how)?说区别/谈优势(difference)以及实践操作(practice)。 What? 1. 什么是Python? Python是一种编程语言,它有...

    各类JAVA大厂面试大全集合

    5. **多线程**:Java提供了丰富的多线程支持,面试中可能会讨论线程的创建、同步机制(如synchronized关键字、volatile、Lock接口)、线程池等。 6. **IO流**:输入/输出流的分类、使用方式以及NIO(New IO)和NIO....

Global site tag (gtag.js) - Google Analytics