线程安全---锁

一,ReentrantReadWriteLock:可重入读写锁

  1,这个类提供了数据写入锁方法 lock.writeLock(); 数据读取锁lock.readLock();

  2,示例代码:

    private ReentrantReadWriteLock lock = new ReentrantReadWritaLock();

    public void fun1(){

      lock.writeLock().lock();//写锁锁上

      //写入操作的代码

      lock.writeLock.unlock();//写锁打开

    }

    public void fun2(){

      lock.readLock().lock();//读锁锁上,但是可多线程同时读

      //读取操作的代码

      lock.readLock().unlock();//读锁打开

    }

二,fork-jion框架

  1.jion:调用线程的jion方法,可以让当前线程等待线程对象执行完毕后再继续执行

  2,jion中可以传入参数(long millis , int nanos),表示等待的时长

  3,fork-jion框架:来解决执行效率,手段是并行,但是是拆分型的并行!如果一个应用能被分解成多个子任务,并且组合多个子任务的结果就能够获得最终的答案,那么这个应用就适合用 Fork/Join 模式来解决。

三,yield,sleep和wait-notify

  1,yield:线程内调用yield方法,表示该线程想要放弃cpu的资源(即我不重要,可先执行其他线程),但是具体cpu是否会放弃它,由cpu决定.

  2,sleep:线程内调用sleep方法可以强制让当前线程休眠,Thread.sleep(long millis)和Thread.sleep(long millis, int nanos).

  3,wait-notify:wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”).notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。wait(long timeout)让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的notify()方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。

  4,wait和sleep的区别

    1).wait是Object类的方法,任何对象都有,而sleep是Thread类的方法\

    2).wait必须写在Synchronized代码块中,并且必须是锁对象调用wait方法,而sleep没有限制(不需要Synchronized)

    3).wait会释放锁对象,而sleep没有限制

    4).wait可以被别的线程唤醒,而sleep需要等待时间结束  

  

  

posted on 2018-04-18 21:09  北冥丶中郎将  阅读(169)  评论(0编辑  收藏  举报