java中同步异步,并行并发,线程安全不安全的区别:
目录
一.同步与异步的区别:
举个例子:
同步:就相当于起床,要先穿衣服,再穿鞋,再洗漱;是按一定顺序的,你做一件事的时候就不能做另一件事。
异步:就相当于你吃饭和看电视这两件事情是可以一起进行的,能够节约时间,提高效率。
概念:
同步 :当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端。这样的话客户端需要一直等待。用户使用起来会有不友好。
异步:当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率。存在就有其道理 异步虽然好 但是有些问题是要用同步用来解决,比如有些东西我们需要的是拿到返回的数据在进行操作的。这些是异步所无法解决的。
二.并行与并发的区别:
并发(concurrent)指的是多个程序可以同时运行的现象,更细化的是多进程可以同时运行或者多指令可以同时运行。但这不是重点,在描述并发的时候也不会去扣这种字眼是否精确,并发的重点在于它是一种现象。并发描述的是多进程同时运行的现象。但实际上,对于单核心CPU来说,同一时刻只能运行一个进程。所以,这里的"同时运行"表示的不是真的同一时刻有多个进程运行的现象,这是并行的概念,而是提供一种功能让用户看来多个程序同时运行起来了,但实际上这些程序中的进程不是一直霸占CPU的,而是执行一会停一会。
并行意味着可以同时取得多个任务,并同时去执行所取得的这些任务。并行模式相当于将长长的一条队列,划分成了多条短队列,所以并行缩短了任务队列的长度。
三.线程安全与线程不安全的区别:
1.什么是线程安全和线程不安全呢?
线程安全是指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性。
线程不安全就是不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
2.什么决定线程安全与不安全呢?
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
3.有哪些可以解决多线程并发访问资源的安全问题呢?
有三种方式:分别是 同步代码块 、同步方法和锁机制(Lock)
1)同步代码块: synchronized(同步锁) { //方法体 }
2)同步方法:给多线程访问的成员方法加上synchronized修饰符 public synchronized void test(){ //方法体 }
3)锁机制(Lock) //Java提供的同步代码块的另一种机制,比synchronized关键字更强大也更加灵活。 //这种机制基于Lock接口及其实现类(例如:ReentrantLock) //它比synchronized关键字好的地方: //1、提供了更多的功能。tryLock()方法的实现,这个方法试图获取锁, //如果锁已经被其他线程占用,它将返回false并继续往下执行代码。 //2、Lock接口允许分离读和写操作,允许多个线程读和只有一个写线程。 //3、具有更好的性能 public class PrintQueue { private final Lock A=new ReentrantLock(); //... }