-
Notifications
You must be signed in to change notification settings - Fork 780
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2019-07-29:如何保证线程安全? #108
Comments
什么是线程安全? |
其实android里面线程安全还是相对较少的,记了那么多多线程的东西 都没怎么用过 这就很气 |
那你把你记得分享下吧,这也算是用处 |
有没有大佬来介绍介绍多线程里面的原子量的用法,还有原理 |
当多个线程要共享一个实例对象的值得时候,那么在考虑安全的多线程并发编程时就要保证下面3个要素: 原子性(Synchronized, Lock) 有序性(Volatile,Synchronized, Lock) 可见性(Volatile,Synchronized,Lock) 当然由于synchronized和Lock保证每个时刻只有一个线程执行同步代码,所以是线程安全的,也可以实现这一功能,但是由于线程是同步执行的,所以会影响效率。 下面是对3个要素的详细解释: 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
在Java中,基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。
可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。 当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取共享变量时,它会去内存中读取新值。 普通的共享变量不能保证可见性,因为普通共享变量被修改后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。 更新主存的步骤:当前线程将其他线程的工作内存中的缓存变量的缓存行设置为无效,然后当前线程将变量的值跟新到主存,更新成功后将其他线程的缓存行更新为新的主存地址 |
如何保证线程安全?
所以:保证线程安全有以下操作
下面有 AtomicInteger AtomicBoolean 等类,作用和 volatile 基本一致,可以看做通用版本的 volatile
AtomicInteger atomicInteger = new AtomicInteger(0);
...
atomicInteger.getAndIncrement();
加锁机制,但是比 synchronized 麻烦,不推荐直接使用,最好用更复杂的锁 ReadWriteLock
Lock lock = new ReentrantLock();
...
lock.lock(); try {
x++;
} finally {
lock.unlock();
} |
线程安全没有明确的定义,一般来讲,多线程情况下程序能表现正确(预期)的行为,那么就认为程序是线程安全的。看下《java并发编程实践这本书》会得到答案。 |
保证线程安全需要保证: |
谈谈个人想法: 2,因此线程安全的保证,换句话说就是:保证当前内存在操作时,无法被其它线程执行 3,可采取的操作:锁同步、某些操作只允许在单一线程执行(例如主线程更新UI采取的就是这种策略) |
线程安全根本原因是:进程间内存隔离,线程间内存共享。如何保证主要有两个方面,
|
No description provided.
The text was updated successfully, but these errors were encountered: