浅谈对synchronized和volatile理解

1.什么是多线程?并发和并行的区别?

     多线程其实就是合理利用cpu的资源去处理一个程序,多个线程去处理一个程序。

      并发:是指在cpu的调度下,多个线程在处理一个程序,只是因为cpu调度的速度很快,就造成了,多个线程在同时处理一个程序的假象。不是真正的同时。

      并行:指一个多个cpu实例或多台机器同时去处理同一程序,是真正的同时。

2.线程的状态

一个新的线程首先进入Runnable(就绪态),然后等待cpu分配资源,进入Running(运行态)时,如果有synchronized关键字(释放锁),则需要通过synchronized来排队(同步),进入等待,等待notify(),notifyAll(),interrupt()来恢复锁,重新进入就绪态等待,再进入到运行态,然而sleep(),join()也会引起线程阻塞,要等待I/O完成或sleep()中断或join中断,才能继续,如果有异常或者运行结束,线程就结束了。Thread类中的yield方法可以让一个running状态的线程转入runnable。

synchronized在sleep()或者等待I/O完成的过程中不会释放,意思就是这个线程就算在休眠时,别的线程也不可以来访问这个线程访问的资源,而这个问题可以lock来解决。

3.synchronized和lock

 两者都是为了解决同步问题,处理资源争端而产生的技术。功能类似但有一些区别。

lock更灵活,可以自由定义多把锁的枷锁解锁顺序(synchronized要按照先加的后解顺序)
提供多种加锁方案,lock 阻塞式, trylock 无阻塞式, lockInterruptily 可打断式, 还有trylock的带超时时间版本。
本质上和监视器锁(即synchronized是一样的)
能力越大,责任越大,必须控制好加锁和解锁,否则会导致灾难。
和Condition类的结合。

总的来说:

synchronized的优点就是实现简单,语义清晰,便于JVM堆栈跟踪,加锁解锁过程由JVM自动控制,提供了多种优化方案,使用更广泛。其缺点是悲观的排他锁,不能进行高级功能

lock的优点是可定时的、可轮询的与可中断的锁获取操作,提供了读写锁、公平锁和非公平锁。缺点是需手动释放锁unlock,不适合JVM进行堆栈跟踪。 

他们的相同点就是他们都是可重入锁

4.volatile 与 synchronized 的比较

线程安全性包括两个方面,①可见性。②原子性。

volatile主要用在多个线程感知实例变量被更改了场合,从而使得各个线程获得最新的值。它强制线程每次从主内存中讲到变量,而不是从线程的私有内存中读取变量,从而保证了数据的可见性。当volatile修饰变量时会禁止指令重排序(有序性)

synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(保证线程同步,线程是安全的),同时我们还应该注意到synchronized另外一个重要的作用,synchronized可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代Volatile功能)

两者之间的比较比较:

①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法。

②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。

synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。

从线程的安全性来说:使用volatile并不能保证线程安全性。而synchronized则可实现线程的安全性。

 

参考:

https://www.cnblogs.com/wxd0108/p/5479442.html

https://www.cnblogs.com/hapjin/p/5492880.html

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章