多线程同步实现的方式

来源:互联网 发布:阿里云ecs建站教程 编辑:程序博客网 时间:2024/06/05 10:55

java主要提供了三种实现同步机制的方法:

 1.synchronized关键字:

        a.synchronized方法,在方法的声明前加入synchronized关键字,如下:public synchronized void mutiThreadAccess();

        b.synchronized代码块:synchronized块既可以把任意的代码段声明为synchronized,也可以指定上锁的对象,有非常搞的灵活性。用法如下:

              synchronized(syncObject){//访问syncObject的代码}

2.wait()方法和notify()方法

         当时用synchronized来修饰某个共享资源时,如果线程A1在执行synchronized代码,另外一个线程A2也要同时执行同一对象的同一synchronized代码时,线程A2将要等到线程A1执行完代码后,才能继续执行。这种情况下可以使用wait()方法和notify()方法

        在synchronized代码被执行期间,线程可以调用对象的wait()方法,释放对象锁,进入等待状态,并且可以调用notify()方法或者notifyall()方法通知正在等待的其他线程,notify()方法仅唤醒一个线程并允许它去获得锁,notifyall()方法唤醒所有等待这个对象的线程并允许他们去获得锁。

3.Lock

        JDK 5新增加了Lock接口以及它的一个实现类ReentrantLock(可重入锁),lock也可以用来实现多线程的同步,具体而言,它提供了如下一些方法来实现多线程的同步:

          a.   lock()以阻塞的方式获取锁,也就是说,如果获取得到了锁,立即返回,如果别的线程持有锁,当前线程等待,只带获取锁后返回

          b.   tryLock()以阻塞的方式获取锁,只是尝试的去获取一下锁,如果获取到锁,立即返回true,否则返回false.

          c.    lockInterruptibly()。如果获取了锁,立即返回,如果没有获取锁,当前线程处于休眠状态,直到获取锁,或者当前线程被别的线程中断,他与lock()方法最大的区别在于如果lock()方法获取不到锁,会一直处于阻塞状态,且会忽略interrupt方法。