Java语言-60:同步方法以及同步方法与同步代码块的区别以及同步锁的概念和作用

1、同步方法:
                1)同步方法就是使用synchronized关键字修饰某个方法,这个方法就是同步方法。被synchronized修饰的方法在某一时刻只允许一个线程访问,访问该方法的其它线程都会发生阻塞,知道当前线程访问完毕后,其它线程才有机会执行该方法。
                2)这个同步方法(非static方法)无须显式指定同步监视器,同步方法的同步监视器是this,也就是调用该方法的对象。
                3)通过同步方法可以非常方便的实现线程安全的类,
                    4)线程安全的类有如下特征:
                            该类的对象可以方便的被多个线程安全的访问;
                            每个线程调用该对象的任意方法之后都能得到正确的结果;
                            每个线程调用该对象的任意方法之后,该对象状态依然能保持合理状态。
目前所接触到的安全线程的类有:  StringBuffer sb = new StringBuffer() ;
                            Vector<String> v = new Vector<String>() ;
                            Hashtable<String, String> hm = new Hashtable<String,String>() ;
                将List<String>转变成线程安全的类:
                Vector<String>它线程安全的类,还是不习惯使用这个集合,通过ArrayList集合:线程不安全的类
List<String> array = new ArrayList(); //线程不安全的类

//public static <T> List<T> synchronizedList(List<T> list)
//返回指定列表支持的同步(线程安全的)列表
List list = Collections.synchronizedList(array) ; //线程安全的方法
2、同步锁:
            1)Java5开始,Java提供了一种功能更加强大的线程同步机制——通过显式定义同步锁对象来实现同步,这里的同步锁由Lock对象充当。
            2)Lock 对象提供了比synchronized方法和synchronized代码块更广泛的锁定操作,Lock是控制多个线程对共享资源进行访问的工具。
            3)通常, 锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应该先获得Lock对象。
            4)某些锁可能允许对共享资源并发访问,如ReadWriteLock(读写锁),Lock,ReadWriteLock是Java5提供的两个根接口,并为 Lock提供了
            5)ReentrantLock实现类,为ReadWriteLock提供了ReentrantReadWriteLock实现类。在 Java8中提供了新型的StampLock类,在大多数场景下它可以替代传统的ReentrantReadWriteLock。 ReentrantReadWriteLock为读写操作提供了三种锁模式:Writing,ReadingOptimistic,Reading。
3、同步方法与同步代码块的区别

                    1)同步方法是用synchronized来修饰方法名;比如:private synchronized static void method(){

                                                                                                            }

                             

                    2)同步代码块是引入了监视器,线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。例如:

                                                    synchronized(lock){

                                                            }

                                        lock就是同步监视器,只有先获得同步监视器的锁定,线程才能执行synchronized代码块。需要注意的是:在使用时,监视器不能写下run()方法里面,必须写下run()外来使用才能保证其作用。

                  3) 同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁,很明显,同步方法锁的范围比较大,而同步代码块范围要小点,一般同步的范围越大,性能就越差,一般需要加锁进行同步的时候,肯定是范围越小越好,这样性能更好。 

                   4)一般在需要时使用同步代码块的方式来保证线程安全,因为使用同步代码块比使用同步方法的性能更佳!        

                

猜你喜欢

转载自blog.csdn.net/qq_41833394/article/details/80500925
今日推荐