java 并发中 volitile、synchronized和lock的比较(一)

1、volitile和(synchronnized、lock)

        首先比较volitile和synchronnized,volitile线程不安全,但是synchronized则是线程安全的。

        volitile修饰的变量主要作用让变量的改变立即写到主存,这样在其它的线程查看此变量的时候是最新的值。Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或是CPU缓存上进行的,之后才会同步到主存中,而加了volatile修饰符的变量则是直接读写主存

        当我们使用lock和synchronized的时候,也可以保证可见性,而且可以保证原子性。synchronized可以修饰一个代码块或者一个方法等,但是显然很多时候volitile的性能要优于synchronized的。

2、synchronized和lock的比较

          两者的最直观的感受就是一个是关键字、一个是类。

          关键字更贴近底层,不像类那么好操作,所以呢一旦synchronized修饰的方法或者代码块之类的拿到锁以后,只有两种情况会释放锁:

                一是修饰的方法或者代码块运行完毕,二是运行出现异常,会释放锁。

                lock则是可以更加灵活应用,可以直接调用lock.lock,也可以调用lock.tryLock()等,获取到锁,那么tryLock()方法更加在未能获得锁的情况下仍然就可以运行下面的不会一直等待,lock接口中还定义了一个方法,就是lockInterruptibly(),

                    1)如果当前线程未被中断,则获取锁。

                    2)如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1。

                    3)如果当前线程已经保持此锁,则将保持计数加 1,并且该方法立即返回。

                    如果该锁被另一个线程持有,则该线程不可被调度(disabled for thread scheduling purposes)(即阻塞状态,CPU不会给该线程分配时间片)直到该线程获取到该锁,并且在获取到锁后,将保持计数设置为1

                    4)如果当前线程获得该锁,则将锁保持计数设置为 1。

                    如果当前线程:

                    1)在进入此方法时已经设置了该线程的中断状态;或者

                    2)在等待获取锁的同时被中断。

                    则抛出 InterruptedException,并且清除当前线程的已中断状态。

                    5)在此实现中,因为此方法是一个显式中断点,所以要优先考虑响应中断,而不是响应锁的普通获取或

                    重入获取。


      未完待续




    

    

你可能感兴趣的:(d)