java并发详解
程序员文章站
2022-07-12 22:08:16
...
线程安全
1.什么是并发?
2.什么是线程安全
3.如何保证线程安全
参考书籍《java并发编程》
此篇博客是回答我懵懂骚年时代的一下疑问,希望可以帮助大家解惑,共勉!!
1.什么是并发?
我喜欢用并行,串行,并发做比较
并行:完全独立在不同CPU上的程序执行,完全平行,没有任何交叉
串行:在同一个CPU上执行的程序,一个个排队执行
并发:在同一个CPU上“同时”执行的程序,这个同时是感官上,其实可以理解为有交叉的意思,程序之前存在资源抢占的情况,
2.并发不一定指的是线程,但是在java中的并发目前只有线程一种形式,在java并发的情况下,总也逃脱不了线程安全性的问题 ,那么什么是线程安全?怎么保证线程安全性?
线程安全的在《java Concurrency In Pracitce》中定义:当多线程访问一个对象时,如果不考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象是线程安全的
其实线程安全更多指的是正确性,在多线程下的结果的正确性
2:怎么保证线程的安全
基本所有的线程安全都是基于对共享数据安全性,如果能保证共享数据的安全或不涉及到共享数据基本既可以保证,具体操作分为如下几种:1,不可变变量 2,线程封闭 3.线程同步机制 4,原子操作
1.不可变变量,是指数据对象被final修饰,其内部的状态(外界可访问的属性)也是被final修饰,此种变量被构造后,不能被修改,因此不存在数据安全的问题,都是要防止此数据在构造完成前的“发布逸出”,既才对象还没有被构造完成,就可以被其他对象引用,在逸出引用的地方会出现未知问题
2.线程封闭,其实就是不共享数据的问题,保证数据不被共享,或保存在线程本身内部(threadLocal)
3.线程同步机制,共享变量的同步,添加互斥锁,保证多线程下串行访问
4,原子操作,JVM 认为最小粒度的操作,也不存在并发的问题,如果AtomicInteger,
大概就这么多吧,想到再做补充,
参考书籍《深入jvm虚拟机》,《java Concurrency In Pracitce》
1.什么是并发?
2.什么是线程安全
3.如何保证线程安全
参考书籍《java并发编程》
此篇博客是回答我懵懂骚年时代的一下疑问,希望可以帮助大家解惑,共勉!!
1.什么是并发?
我喜欢用并行,串行,并发做比较
并行:完全独立在不同CPU上的程序执行,完全平行,没有任何交叉
串行:在同一个CPU上执行的程序,一个个排队执行
并发:在同一个CPU上“同时”执行的程序,这个同时是感官上,其实可以理解为有交叉的意思,程序之前存在资源抢占的情况,
2.并发不一定指的是线程,但是在java中的并发目前只有线程一种形式,在java并发的情况下,总也逃脱不了线程安全性的问题 ,那么什么是线程安全?怎么保证线程安全性?
线程安全的在《java Concurrency In Pracitce》中定义:当多线程访问一个对象时,如果不考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象是线程安全的
其实线程安全更多指的是正确性,在多线程下的结果的正确性
2:怎么保证线程的安全
基本所有的线程安全都是基于对共享数据安全性,如果能保证共享数据的安全或不涉及到共享数据基本既可以保证,具体操作分为如下几种:1,不可变变量 2,线程封闭 3.线程同步机制 4,原子操作
1.不可变变量,是指数据对象被final修饰,其内部的状态(外界可访问的属性)也是被final修饰,此种变量被构造后,不能被修改,因此不存在数据安全的问题,都是要防止此数据在构造完成前的“发布逸出”,既才对象还没有被构造完成,就可以被其他对象引用,在逸出引用的地方会出现未知问题
2.线程封闭,其实就是不共享数据的问题,保证数据不被共享,或保存在线程本身内部(threadLocal)
3.线程同步机制,共享变量的同步,添加互斥锁,保证多线程下串行访问
4,原子操作,JVM 认为最小粒度的操作,也不存在并发的问题,如果AtomicInteger,
大概就这么多吧,想到再做补充,
参考书籍《深入jvm虚拟机》,《java Concurrency In Pracitce》
上一篇: ThreadLocal本地线程变量的理解
下一篇: 为什么HashMap不是线程安全的