- 浏览: 149198 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
EclipseEye:
fair_jm 写道不错 蛮详细的 谢谢分享
SWT/JFace专题 --- SWT中Display和多线程 -
fair_jm:
不错 蛮详细的 谢谢分享
SWT/JFace专题 --- SWT中Display和多线程
线程安全
==================
同步
-------
Java 提供了 synchronized 关键字来支持内在锁。Synchronized 关键字可以放在方法的前
面、对象的前面、类的前面。
1. 同步方法中的锁
2. 同步语句
3. 同步类
把 synchronized 关键字放在类的前面,这个类中的所有方法都是同步方法。
4. 可重入同步
线程可以获得他已经拥有的锁,运行线程多次获得同一个锁,就是可以重入(reentrant)
同步。
这种情况通常是同步代码直接或者间接的调用也包含了同步代码的方法,并且两个代
码集都使用同一个锁。
================================
同步与volatile
---------------
它不提供对锁的独占访问,但同样可以确保对变量的每一个
读取操作都返回最近写入的值(read-before-wright 原则),这种机制就是只用 volatile 变量。
================================
活性
----------
并发应用程序按照及时方式执行的能力称为活性。
一般包括三种类型的问题 死锁、饿死 和 活锁。
1. 死锁
线程死锁是并发程序设计中可能遇到的主要问题之一。他是指程序运行中,多个线程竞
争共享资源时可能出现的一种系统状态,每个线程都被阻塞,都不会结束,进入一种永久等
待状态。
2. 饿死
饿死(starvation)描述这样的情况:一个线程不能获得对共享资源的常规访问,并且不
能继续工作,当共享资源被贪婪线程长期占有而不可用时,就会发生这样的情况。
3. 活锁
和死锁类似,发生活锁的线程不能进行进一步操作。但是,线程没有被锁定,
它只是忙于相互响应,以致不能恢复工作。 比如都调用了wait方法
=======================================
ThreadLocal 变量
-----------------
其实 ,ThreadLocal并不是一个 Thread,而是 Thread 的局部变量。
当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独
立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应
的副本。
ThreadLocal 和线程同步机制相比有什么优势呢?
ThreadLocal 和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,
而 ThreadLocal 采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队
访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
需要注意的是 ThreadLocal 对象是一个本质上存在风险的工具,应该在完全理解将要使
用的线程模型之后,再去使用 ThreadLocal 对象。这就引出了线程池(thread pooling)的 问 题 ,
线程池是一种线程重用技术,有了线程池就不必为每个任务创建新的线程,一个线程可能会
多次使用,用于这种环境的任何 ThreadLocal 对象包含的都是最后使用该线程的代码所设置
的状态,而不是在开始执行新线程时所具有的未被初始化的状态。
====================================================
高级并发对象
--------------
主要增加的高级并发对象有:Lock 对象,执行器,并发集合、原子变量和同步器。
1)Lock 对象
Lock 对象的最大优势在于能够阻挡获得锁的企图。如果锁不能立即可用或者在超时时间到期之前可用,
tryLock 方法就会阻挡,如果另一个线程在获得锁之前发送中断,lockInterruptibly 方法就会阻挡。
2)执行器
线程完成的任务(Runnable 对象)和线程对象(Thread)之间紧密相连。适用于小型程序,
在大型应用程序中,把 线程管理和创建工作 与应用程序的其余部分 分离 开更有意义。
封装线程管理和创建的对象被称为执行器(Executor)。
JDK 中定义了 3 个执行器接口:Executor,ExecutorService 和 ScheduledExecutorService。
3)并发集合
并发集合是原有集合框架的补充,为多线程并发程序提供了支持。主要有:
BlockingQueue,ConcurrentMap,ConcurrentNavigableMap。
4)原子变量
定义了支持对单一变量执行原子操作的类。所有类都有 get 和 set 方法,工作方法和对
volatile 变量的读取和写入一样。
5)同步器
提供了一些帮助在线程间协调的类,包括 semaphores, mutexes, barriers, latches,
exchangers 等。
==================
同步
-------
Java 提供了 synchronized 关键字来支持内在锁。Synchronized 关键字可以放在方法的前
面、对象的前面、类的前面。
1. 同步方法中的锁
public synchronized void deposit(int amount) { balance = balance + amount; }
2. 同步语句
public void deposit(int amount) { synchronized (this) { balance = balance + amount; } }
3. 同步类
把 synchronized 关键字放在类的前面,这个类中的所有方法都是同步方法。
4. 可重入同步
线程可以获得他已经拥有的锁,运行线程多次获得同一个锁,就是可以重入(reentrant)
同步。
这种情况通常是同步代码直接或者间接的调用也包含了同步代码的方法,并且两个代
码集都使用同一个锁。
================================
同步与volatile
---------------
它不提供对锁的独占访问,但同样可以确保对变量的每一个
读取操作都返回最近写入的值(read-before-wright 原则),这种机制就是只用 volatile 变量。
================================
活性
----------
并发应用程序按照及时方式执行的能力称为活性。
一般包括三种类型的问题 死锁、饿死 和 活锁。
1. 死锁
线程死锁是并发程序设计中可能遇到的主要问题之一。他是指程序运行中,多个线程竞
争共享资源时可能出现的一种系统状态,每个线程都被阻塞,都不会结束,进入一种永久等
待状态。
2. 饿死
饿死(starvation)描述这样的情况:一个线程不能获得对共享资源的常规访问,并且不
能继续工作,当共享资源被贪婪线程长期占有而不可用时,就会发生这样的情况。
3. 活锁
和死锁类似,发生活锁的线程不能进行进一步操作。但是,线程没有被锁定,
它只是忙于相互响应,以致不能恢复工作。 比如都调用了wait方法
=======================================
ThreadLocal 变量
-----------------
其实 ,ThreadLocal并不是一个 Thread,而是 Thread 的局部变量。
当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独
立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应
的副本。
ThreadLocal 和线程同步机制相比有什么优势呢?
ThreadLocal 和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,
而 ThreadLocal 采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队
访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
需要注意的是 ThreadLocal 对象是一个本质上存在风险的工具,应该在完全理解将要使
用的线程模型之后,再去使用 ThreadLocal 对象。这就引出了线程池(thread pooling)的 问 题 ,
线程池是一种线程重用技术,有了线程池就不必为每个任务创建新的线程,一个线程可能会
多次使用,用于这种环境的任何 ThreadLocal 对象包含的都是最后使用该线程的代码所设置
的状态,而不是在开始执行新线程时所具有的未被初始化的状态。
====================================================
高级并发对象
--------------
主要增加的高级并发对象有:Lock 对象,执行器,并发集合、原子变量和同步器。
1)Lock 对象
Lock 对象的最大优势在于能够阻挡获得锁的企图。如果锁不能立即可用或者在超时时间到期之前可用,
tryLock 方法就会阻挡,如果另一个线程在获得锁之前发送中断,lockInterruptibly 方法就会阻挡。
2)执行器
线程完成的任务(Runnable 对象)和线程对象(Thread)之间紧密相连。适用于小型程序,
在大型应用程序中,把 线程管理和创建工作 与应用程序的其余部分 分离 开更有意义。
封装线程管理和创建的对象被称为执行器(Executor)。
JDK 中定义了 3 个执行器接口:Executor,ExecutorService 和 ScheduledExecutorService。
3)并发集合
并发集合是原有集合框架的补充,为多线程并发程序提供了支持。主要有:
BlockingQueue,ConcurrentMap,ConcurrentNavigableMap。
4)原子变量
定义了支持对单一变量执行原子操作的类。所有类都有 get 和 set 方法,工作方法和对
volatile 变量的读取和写入一样。
5)同步器
提供了一些帮助在线程间协调的类,包括 semaphores, mutexes, barriers, latches,
exchangers 等。
发表评论
-
Nio Socket
2013-05-16 05:53 0asfda -
结合jdk源码解读,Error Exception
2013-05-10 04:00 0/* * @(#)Error.java 1.17 05/11 ... -
从不同的角度,重新审视class和interface
2013-05-07 03:40 0java开发中,对应class和interface的基本区别都 ... -
java.lang.Object
2013-05-07 03:35 0/* * @(#)Object.java 1.73 06/0 ... -
反射机制+类加载机制
2013-02-18 01:30 0反射机制+类加载机制 -
Eclipse Job并发框架专题
2013-02-18 00:43 01并发性架构 2使用作业 3用户交互选项 4作业的冲突管 ... -
并发专题----使用开源软件Amino构建并发应用程序/多线程运行时分析工具MTRAT
2013-02-14 00:50 1370使用开源软件构建并发 ... -
并发专题 --- 锁
2013-02-14 00:50 802相比于synchronized,ReentrantLock 提 ... -
并发专题 ----(JMM)java内存模型
2013-02-14 00:50 534Java 内存模型 ------------ ... -
并发专题 ---java.util.concurrent 包
2013-02-13 02:26 1832java.util.concurrent 包 原 ... -
并发专题---并发基础概念
2013-02-13 02:26 573进程VS程序 --进程是执行程序的动态过程,而程序是进程运行的 ... -
集合框架 Queue篇(8)---PriorityBlockingQueue、SynchronousQueue
2013-02-07 12:40 1303Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(7)---LinkedBlockingDeque
2013-02-07 12:40 849Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(6)---LinkedBlockingQueue
2013-02-07 12:39 827Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(5)---ArrayBlockingQueue
2013-02-06 10:39 700Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(4)---阻塞队列和生产者-消费者模式、DelayQueue
2013-02-06 10:39 992Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(3)---ConcurrentLinkedQueue
2013-02-06 10:38 1043Queue ------------ 1.ArrayDequ ... -
集合框架 Queue篇(2)---PriorityQueue
2013-02-06 10:38 828Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(1)---ArrayDeque
2013-02-06 10:38 926Queue ------------ 1.ArrayDeq ... -
集合框架 Set篇---HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、ConcurrentSkipList
2013-02-05 08:43 1477Set --------- 1.HashSet 2.Link ...
相关推荐
- 线程安全的函数:例如`pthread_rwlock`系列的读写锁函数。 8. **线程性能分析**: - 线程创建和销毁开销:过多的线程可能导致资源浪费,应合理控制线程数量。 - 线程同步开销:过度同步可能导致饥饿现象,合理...
- 线程安全问题主要包括:数据竞争、死锁、活锁和饥饿等。解决这些问题通常通过同步机制、线程通信(wait/notify、条件变量等)和线程池(ExecutorService)等手段。 8. **多线程细节** - 线程优先级:线程可以...
为确保线程安全,可以使用线程局部存储(`ThreadLocal`),或者设计为不可变对象,或者使用同步容器,如`Vector`、`Collections.synchronizedXXX()`方法包装的集合,以及`ConcurrentHashMap`等并发容器。 **死锁**是...
综上所述,本面试专题涵盖了并发编程中的诸多关键知识点,包括但不限于并发控制、线程通信、死锁处理、线程池的使用以及并发集合的运用。深入理解和熟练掌握这些内容,将有助于在面试中表现出对高并发编程的深厚功底...
【并发编程】是Java开发中的重要领域,面试中经常被问到。理解并掌握线程的状态转换对于理解和解决并发问题至关重要。...理解这些概念对于编写高效、安全的并发程序至关重要,也是Java面试中常考察的知识点。
在并发领域,"并发面试专题.pdf"可能会包含线程安全、锁机制、并发工具类如Semaphore、CountDownLatch和CyclicBarrier,以及Java内存模型(JMM)等内容。求职者需要了解如何避免死锁,掌握线程池的工作原理,以及...
在这个“并发专题.zip”压缩包中,我们可以期待找到一系列关于并发编程的知识点和资源。 并发编程的核心概念包括线程、进程、同步与互斥、死锁、活锁以及饥饿等。下面我们将详细讨论这些关键概念。 1. **线程与...
- **java.util.concurrent** 包:提供线程安全的数据结构和并发工具类。 - **ExecutorService** 和 **ThreadPoolExecutor**:管理线程池,实现线程的创建、管理和销毁。 - **Future** 和 **Callable**:异步计算...
综上所述,Synchronized关键字是Java并发编程中的一个重要组成部分,通过对其实现机制的理解以及JVM对其优化策略的掌握,可以更有效地在多线程环境中使用Synchronized来保证数据的一致性和安全性。
本面试专题主要探讨的是与虚拟机相关的知识,尤其是针对Java开发者的关键点。 首先,我们需要理解JVM的结构。JVM主要包括类加载器、运行时数据区、执行引擎、本地方法接口和本地库。类加载器负责加载.class文件,...
面试时,面试官经常考察候选者对于并发控制、线程安全、性能优化等关键概念的理解和实践经验。本资料集旨在帮助求职者准备Java并发编程相关的面试问题。 1. **线程与进程** - **线程定义**:线程是程序执行的最小...
理解双亲委派模型,知道如何自定义类加载器,以及理解类加载过程中的线程安全问题,都是面试官可能关注的点。 性能优化方面,JVM的内存调优是关键。合理设置堆大小、新生代与老年代的比例、eden区和survivor区的...
线程安全通常涉及到同步机制,确保数据在并发访问时的一致性。 5.2 竞态条件 当多个线程同时修改共享数据,且结果依赖于线程执行顺序时,就会出现竞态条件。竞态条件可能导致数据不一致或未定义行为,需要通过锁或...
在这个例子中,`ReentrantLock` 作为 `Lock` 的实现,用于同步 `increment()` 方法,确保对 `i` 的修改是线程安全的。 总结来说,Java并发编程中的线程同步是通过`synchronized` 关键字和 `Lock` 锁来实现的,它们...
6. **并发容器**:如ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue等,这些并发容器提供了线程安全的数据结构,理解和运用它们可以提高并发编程的效率和安全性。 7. **并发工具类**:如CountDownLatch、...
这个Java线程专题学习资料可能包含了上述知识点的详细讲解,尤其是从JavaEye社区收集的经典教程,将帮助开发者深入理解Java线程的使用和优化,提升并发编程能力。通过学习和实践,你可以掌握如何在多线程环境中编写...
在并发编程领域,Java语言提供了丰富的工具和机制来支持多线程环境下的高效开发。"04 并发编程专题02.zip"这个...通过学习这些内容,开发者可以更好地理解和掌握如何在复杂的并发环境中构建高性能、线程安全的应用。
最后,Java的并发集合类如`ConcurrentHashMap`, `ConcurrentLinkedQueue`, `CopyOnWriteArrayList`等,提供了线程安全的数据结构,能够在多线程环境下保证数据的一致性和正确性,避免了手动加锁的复杂性。...