1,简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?
答: 主要相同点: Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
2,同步有几种实现方法 , 都是什么?
同步的实现方面有两种,分别是synchronized, wait与notify
3,sleep() 和 wait() 有什么区别 ?
答: sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
4,volatile是用来做什么的?
volatile 的意思是变量的值不能被JVM优化,这样可以在某一程度上保证变量的可见性。
5、启动一个线程是用run()还是start()?
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
6、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
答:不能,一个对象的一个synchronized方法只能由一个线程访问。
7、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
8.我可以重载start()方法么?
因为Thread类的start()方法并不是final方法,因此可以,但不推荐这样做。因为在start()方法里创建一个新的线程,进行特定的操作。你可以传递一个实现了Runnable接口的类到Thread,或者继承Thread类,重载run()方法。
9 synchronized关键字:
第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁。
第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁。
第三点:synchronized修饰一个代码块。类似这样:synchronized(obj) { //code.... }。表示一个线程要执行该代码块,必须获得obj的锁。这样做的目的是减小锁的粒度,保证当不同块所需的锁不冲突时不用对整个对象加锁。利用零长度的byte数组对象做obj非常经济。
10 atomic action(原子操作):
在JAVA中,以下两点操作是原子操作。但是c和c++中并不如此。
第一点:对引用变量和除了long和double之外的原始数据类型变量进行读写。
第二点:对所有声明为volatile的变量(包括long和double)的读写。
另外:在java.util.concurrent和java.util.concurrent.atomic包中提供了一些不依赖于同步机制的线程安全的类和方法。
11 notify方法和notifyAll方法:
notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。
notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。
12 wait方法:
该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。
调用wait方法需要注意几点:
第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。
第二点:恢复执行后,从wait的下一条语句开始执行,因而wait方法总是应当在while循环中调用,以免出现恢复执行后继续执行的条件不满足却继续执行的情况。
第三点:若wait方法参数中带时间,则除了notify和notifyAll被调用能激活处于wait状态(等待状态)的线程进入锁竞争外,在其他线程中interrupt它或者参数时间到了之后,该线程也将被激活到竞争状态。
第四点:wait方法被调用的线程必须获得之前执行到wait时释放掉的锁重新获得才能够恢复执行。
- 浏览: 955245 次
- 性别:
- 来自: 魔都
文章分类
- 全部博客 (745)
- MultiThread (19)
- My Plan (118)
- JavaBasic (61)
- MyInterview (104)
- InternetTechnique (5)
- ProjectConclusion (1)
- Maven (5)
- MogoDb (5)
- Hadoop (11)
- Memcached (6)
- TechniqueCollect (1)
- Ibaits (1)
- Android (34)
- ItLife (40)
- Tree (2)
- ProjectArchitect (7)
- Open Source (3)
- liunx (5)
- socket (8)
- Spring (27)
- DesginPattern (35)
- WebBasic (13)
- English (13)
- structs (1)
- structs2 (2)
- Oracle (17)
- Hibernate (2)
- JavaScript (4)
- Jdbc (1)
- Jvm (15)
- Ibatis (1)
- DataStructures (13)
- Https/Socket/Tcp/Ip (3)
- Linux (4)
- Webservice (7)
- Io (2)
- Svn (1)
- Css (1)
- Ajax (1)
- ExtJs (1)
- UML (2)
- DataBase (6)
- BankTechnique (3)
- SpringMvc (3)
- Nio (3)
- Load Balancing/Cluster (3)
- Tools (1)
- javaPerformanceOptimization (8)
- Lucene(SEO) (1)
- My Think (80)
- NodeJs (1)
- Quartz (1)
- Distributed-java (1)
- MySql (7)
- Project (4)
- junit (4)
- framework (1)
- enCache (1)
- git (2)
- SCJP (1)
- sd (1)
最新评论
-
lkjxshi:
你都这水平了还考这个证干嘛
SCJP 认证考试指南 -
钟逸华:
问的真多
百度java开发面试题(转) -
zuimeitulip:
觉得我就是这样的,从小阅读量就很少,导致现在的读的速度非常慢, ...
让读书成为一种习惯 -
DDT_123456:
我觉得你是不符合要求。问你hashmap的那个问题,你那样回答 ...
阿里面试2(转) -
jingjing0907:
刚刚写了很多读过此博客的感受,竟然没有发上去,以为我注册账号还 ...
让读书成为一种习惯
- CV.rar (48.3 KB)
- 下载次数: 4
发表评论
文章已被作者锁定,不允许评论。
-
关于java堆内存溢出的几种情况
2015-02-28 09:52 1129【情况一】: java ... -
图解TCP-IP协议(转)
2014-09-19 13:28 1051http://www.cricode.com/3568.h ... -
性能调优思考(转)
2013-11-20 19:42 1128前言 这篇文章非常有意思,写于2012年11 ... -
http协议详解(超详细)转
2013-11-06 23:23 1040http://blog.csdn.net/gueter/ar ... -
http协议详解(超详细)转
2013-11-06 23:18 968http://blog.csdn.net/gueter/ar ... -
java垃圾回收精华
2013-10-30 20:22 845本文系翻译: 原文地址:mechanical-sympath ... -
Eclipse快捷键 10个最有用的快捷键(转)
2013-10-28 23:11 861Eclipse快捷键 10个最有用的快捷键 ... -
深入理解Java Proxy机制(转)
2013-10-06 16:25 1049动态代理其实就是java.lang.reflect.P ... -
8 张图助你更好地理解 Java 编程(转)
2013-09-24 22:11 744所谓一图胜万言,本文中的这些图都是从ProgramCreek ... -
Java中堆与栈详解
2013-08-25 21:15 1017http://bbs.itcast.cn/thread-16 ... -
正确读取与设置缓存方法
2013-07-22 20:13 1299正确读取与设置缓存方法 博客分类: 并发编程 ... -
JAVA集合小结
2013-07-16 22:57 887JAVA集合小结 http://www.blogjava. ... -
四种java内部类总结
2013-07-15 19:11 7795第一 成员内部类 定义在另一个类的内部,而且与成员方法和属性 ... -
全国(大学)高等教育各学科视频教学全集
2013-05-30 20:01 2249为了方便已就 ... -
让你彻底明白JAVA中堆与栈的区别
2013-04-24 23:49 1024简单的说: Java把内存划分成两种:一种是栈内存,一种是堆 ... -
JDK中有关23个经典设计模式的示例
2013-04-23 21:55 759Structural(结构模式) Adapter: 把一个 ... -
JDK1.5/1.6/1.7之新特性总结
2013-03-19 21:59 1060开发过程中接触到了从jdk1.5---jdk1.7的使用,在 ... -
java中String和StringBuffer的区别(转载)
2013-03-14 14:27 917看到这个讲解的不错,所以转一下 在java中有3个类来负责 ... -
高效java异常处理机制
2013-01-30 19:41 1527Java开发人员做出的有 ... -
Java 常用数据结构深入分析(Vector、ArrayList、List、Map)
2013-01-17 13:55 1376在网上偶然看到一 ...
相关推荐
其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题:可见性和有序性。我们都知道计算机有高速缓存...
Java线程让步是多线程编程中一个重要的概念,主要涉及到如何控制线程的执行顺序和资源分配。`yield()`方法是Java提供的一种线程让步的方式,它允许当前正在执行的线程暂停,将执行权短暂地让给其他等待的线程,特别...
Java线程中的`join()`方法是一个非常重要的同步工具,它允许一个线程(通常为主线程)等待另一个线程(子线程)执行完成后再继续执行。`join()`方法定义在`java.lang.Thread`类中,它使得多线程间的协作更加有序。 ...
在Java编程语言中,多线程和同步是两个至关重要的概念,它们对于构建高效、可靠的并发应用程序至关重要。这里我们将深入探讨这两个主题,并结合源码分析,以帮助你更好地理解和掌握。 1. **Java多线程** Java多...
Java 中实现线程的三种方式及对比 Java 中创建线程主要有三种方式:继承 Thread 类创建线程类、通过 Runnable 接口创建线程类、通过 Callable 和 Future 创建线程。 继承 Thread 类创建线程类 继承 Thread 类创建...
以下是对Java线程相关知识点的详细说明: 1. **线程的创建与执行** - 创建线程有两种方式:继承`Thread`类或者实现`Runnable`接口。继承`Thread`直接重写`run()`方法,而实现`Runnable`接口则需要提供一个包含业务...
Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高系统的效率和响应性。在Java中,线程的管理涉及到线程组、异常处理等多个方面。下面我们将详细探讨这些知识点。 首先,线程组(Thread...
下面将基于这些信息,综合整理出与Java线程相关的知识点。 ### Java线程基础 1. **线程的概念**:在Java中,线程是程序执行流的最小单元,一个标准的Java应用程序至少有一个线程,即主线程(main thread)。Java中...
Java多线程整理汇总思维导图
Java多线程知识点整理.pdf
Java+创建线程的例子源码整理
6. **Java线程文档**: `java线程.doc`和`Java线程.pdf`可能详细介绍了线程的生命周期、状态转换、线程间的通信(例如wait()、notify()、notifyAll()方法)、死锁、活锁等问题,以及如何通过`Thread.sleep()`、`yield...
Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...
根据给定文件的信息,我们可以提炼出以下相关的Java线程知识点: ...以上内容是根据给定文件中的信息整理出的关于Java线程的相关知识点。通过对这些概念的理解和掌握,可以更好地理解和应用Java中的多线程技术。
Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类、实现`Runnable`接口或`Callable`接口以及使用`ExecutorService`...
在Java中,`Thread`类和`Runnable`接口是实现多线程的基础,我们可以创建多个线程实例,分别绑定到不同的下载任务上。 然而,实现多线程断点续传需要解决几个问题: 1. **同步管理**:多个线程可能会同时访问同一个...
以下是根据题目内容整理的一些Java线程相关知识点: 1. **线程睡眠**:`Thread.sleep()`方法用于使当前线程进入睡眠状态,参数单位为毫秒。例如,`sleep(10000)`表示线程将休眠10秒。 2. **线程创建方式**:Java...
- Java多线程编程知识包括线程创建、线程同步、线程通信以及线程池的使用等方面。 - 并发编程的相关知识点,例如锁机制、原子操作、volatile关键字等,也是面试时经常被问到的内容。 这些知识点涵盖了Java面试中...