线程安全---锁
一,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需要等待时间结束