-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmultithread ideas
More file actions
71 lines (49 loc) · 4.39 KB
/
multithread ideas
File metadata and controls
71 lines (49 loc) · 4.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
multithread
进程和线程
进程是程序运行的资源分配的基本单位,可以单独启用有单独的空间
线程是cpu调度和分配的基本单位在进程中运行,线程彼此之间共享内存
线程间切换更加快速 而进程切换更为复杂所以采用multithreading 就是处理多个任务的能力
单线程就是cpu只能只从一个任务 剩下的要排队
Advantages of multithreading
Better use of system resources
Enhanced performance on multi-processor / multi-core machines
Simultaneous and parallelized occurrence of tasks
Disadvantages of multithreading
Complex debugging and testing processes
Overhead switching of context
Unpredictable results
Increased potential for deadlock
线程安全
指的是内存的安全防止被其他子线程访问到所有信息 每个进程只能访问分配给自己的内存空间
stack memory
存放局部变量值primitive values,reference to obj,在方法结束时系统会释放当前stack对应的变量随着线程销毁而结束 所以定义在函数内部就是线程安全的变量
heap memory
jvm又一个heap被所有线程共享 heap不是线程安全
jmm: java memory model
1.原子性 是指对共享内存的操作必须是要么全部执行直到执行结束, 且中间过程不能被任何外部因素打断, 要么就不执行.
2.可见性 是指当多个线程访问同一个变量时, 一个线程修改了这个变量的值, 其他线程能够立即看得到修改的值.
3.有序性即程序执行的顺序按照代码的先后顺序执行.
volatile
定义在变量上的关键字 线程上的值是变化的 意味着需要去主内存读取数据
volatile的原理
如果一个变量被volatile所修饰的话, 在每次数据变化之后, JVM会向处理器发送一条lock前缀的指令, 将这个缓存中的变量回写到系统主存中.
而其他处理器的缓存由于遵守了缓存一致性协议, 也会把这个变量的值从主存加载到自己的缓存中. 这就保证了一个volatile在并发编程中, 其值在多个缓存中是可见的.
Lock前缀指令实际上相当于一个内存屏障, 内存屏障会提供3个功能:
1. 它会强制将对缓存的修改操作立即写入主存.
2. 如果是写操作, 它会导致其他CPU中对应的缓存行无效(保证了可见性).
3. 它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置, 也不会把前面的指令排到内存屏障的后面; 即在执行到内存屏障这句指令时, 在它前面的操作已经全部完成.(保证了有序性)
缓存一致性协议: 每个处理器通过从总线上传播过来的数据来检查自己缓存的值是不是过期了, 当处理器发现自己缓存行对应的内存地址被修改,
就会将当前处理器的缓存行设置成无效状态, 当处理器要对这个数据进行修改操作的时候, 会强制重新从系统内存里把数据读到处理器缓存里.
volatile不能保证原子性但保证其他两个性质;但是syncronize保证三个特性(原子性,有序性,可见行)
How to avoid thread safe problem
1.Stateless implementation: A class without instance variables.
2.Immutable implementation: A class instance is immutable when its internal state can’t be modified after it has been constructed.
3.synchronized(同步): Only one thread can access a synchronized method at a time while blocking access to this method from other threads.
4.lock: A lock is a thread synchronization mechanism like synchronized blocks except locks can be more sophisticated than Java's synchronized blocks.
Differences between Lock and Synchronized
Lock是一个接口, 是JDK层面的实现; 而synchronized是Java中的关键字, 是Java的内置特性, 是JVM层面的实现.
synchronized 在发生异常时会自动释放线程占有的锁, 因此不会导致死锁现象发生; 而Lock在发生异常时, 如果没有主动通过unLock()去释放锁, 则很可能造成死锁现象,
因此使用Lock时需要在finally块中释放锁.
Lock可以让等待锁的线程响应中断, 而使用synchronized时, 等待的线程会一直等待下去, 不能够响应中断.
Lock可以提高多个线程进行读操作的效率
从性能上来说, 如果竞争资源不激烈, 两者的性能是差不多的. 而当竞争资源非常激烈时(即有大量线程同时竞争), 此时Lock的性能要远远优于synchronized. 所以在具体使用时要根据适当情况选择.