并发编程的目的是为了让程序运行的更快,因为并发会启动很多的线程,而如果我们使用进程来处理这些问题,它的速度会很慢,因为线程较进程更为轻量级,进程切换时需要刷新
T
L
B
(
TLB(
TLB(快表
)
)
)并获取新的地址空间,然后切换硬件上下文和内核栈,而线程切换只需要切换硬件上下文和内核栈,这里的上下文切换可以理解为看书,如果你现在想去查一下字典,那么你必须先记住现在看到多少页了,也就是保存上一个任务的状态,任务从保存到再加载的过程就是一次上下文切换
这个程序的死锁思路就是首先在线程t1中
A
A
A持锁,然后休眠1秒,这时候线程t2中
B
B
B持锁,现在t2要拿
A
A
A的锁,t1要拿
B
B
B的锁,所以就陷入了死锁状态
2. Java并发机制的两个重要修饰符
2.1 volatile
v
o
l
a
t
i
l
e
volatile
volatile是轻量级的
s
y
n
c
h
r
o
n
i
z
e
d
synchronized
synchronized,它在多处理器开发中保证了共享变量的“可见性”,意思就是如果有一个线程修改一个共享变量时,另外一个线程能读到这个修改的值,且
v
o
l
a
t
i
l
e
volatile
volatile变量修饰符不会引起线程上下文的切换和调度,所以它的使用和执行成本更低
v
o
l
a
t
i
l
e
volatile
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值(一行汇编代码lock addl...,首先将当前处理器缓存行的数据写回到系统内存,这个写回内存的操作会使其他CPU里缓存了该内存地址的数据无效,这主要是应用了处理器的嗅探技术保证内部缓存、系统缓存和其他处理器的缓存的数据在总线上保持一致)。
2.2 synchronized
s
y
n
c
h
r
o
n
i
z
e
d
synchronized
synchronized修饰符修饰的方法同一时间只能被一个线程访问