From 847bf9a25ab2202d7b4cacb7f9eb2a30b21103d0 Mon Sep 17 00:00:00 2001 From: dingqy Date: Fri, 27 Apr 2018 11:23:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BA=BF=E7=A8=8B=E5=AE=89?= =?UTF-8?q?=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- notes/Java 并发.md | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 314f02b1..61f36d59 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -*.txt \ No newline at end of file +*.txt +.idea/ diff --git a/notes/Java 并发.md b/notes/Java 并发.md index edc9dc0f..1611e63f 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -1235,8 +1235,17 @@ join() 方法返回先行发生于 Thread 对象的结束。 # 十一、线程安全 -## 线程安全分类 +##线程安全定义 +一个类在可以被多个线程安全调用时就是线程安全的。 +##考虑线程安全的情况: +- 静态成员变量,静态成员变量位于方法区,所有对象共享一份内存,一旦修改静态成员变量被修改,所有对象均可见,所以是线程非安全。 +- 实例成员变量,实例变量为对象实例私有,在虚拟机的堆heap中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样, +被某个线程修改后,其他线程对修改均可见,故线程非安全(如,springmvc controller是单例的,非线程安全的);如果每个线程执行都是在不同的 +对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全(如,struts2 action默认是非单例的,每次请求在heap中new新的action实例, +故struts2 action可以用实例成员变量)。 +- 局部变量,局部变量位于栈区,线程间不共享,方法结束就可能被回收,线程安全 +## 线程安全分类 线程安全不是一个非真即假的命题,可以将共享数据按照安全程度的强弱顺序分成以下五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。 ### 1. 不可变