并发专题 ---- 线程安全

线程安全
==================
同步
-------
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 等。

你可能感兴趣的:(线程安全)