JAVA基础知识总结:十九

一、多线程使用过程中的临界资源问题

1.临界资源:被多个线程同时访问的资源

临界资源产生的原因:有多个线程同时访问一个资源的时候,如果一个线程在取值的过程中,时间片又被其他的线程抢走了,临界资源问题就产生了


如何解决临界资源问题?
一个线程在访问临界资源的时候,如果给这个资源上一把锁,这个时候如果其他线程也要访问这个资源的话,就需要在锁外面等待


2.锁:

对象锁:在Java中,任意的对象都可以被当做锁来使用
类锁:把一个类当做锁,语法:类名.class


二、使用锁来解决临界资源问题

1.同步代码块
语法:
synchronized(锁) {

}

说明:
a.程序执行到了同步代码块中,就使用锁锁住了临界资源,这个时候,其他的线程是不能执行代码段中的代码的,只能在锁外面进行等待
b.执行完代码段中的代码,会进行自动解锁,那么这个时候其他的线程开始争抢时间片
c.一定要保证不同的线程看到的是同一把锁,否则同步代码块没有意义


2.同步方法
synchronized 访问权限修饰符 返回值类型 函数名(参数列表) {
//被多个线程可以同时访问的临界资源
}

3.同步锁(JDK1.5之后新增的)
可以通过定义同步锁对象来实现同步,和同步代码块以及同步方法具有相同的效果

1>使用ReentrantLock类来进行锁的操作,实现了Lock接口
lock():加锁
unlock():解锁

三、单例在多线程中的应用

四、生产者与消费者设计模式
1.对临界资源问题的应用
它描述的是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者可以从仓库中取走产品,解决生产者消费者问题,我们需要做的就是保证生产者和消费者之间的同步

同步问题的核心:常用的方式就是加锁,目的是为了保证在任意时刻资源只能被一个线程访问

2.实现
wait():当缓冲区已满或者为空的情况下,生产者/消费者停止自己的执行,放弃锁,使自己处于等待状态,让其他线程执行
Object的方法
调用方法:对象.wait()
释放 对象 这个锁标记,然后再锁外面进行等待(sleep是持有锁进行休眠)
必须放到同步代码段中执行


notify():当生产者/消费者向缓冲区中放入/取走一个产品时,向其他等待的线程发出通知,同时使自己放弃锁,处于等待状态
Object的方法
调用方法:对象.notify()
表示唤醒 对象 锁标记外面正在等待的一个线程


notifyAll():全部唤醒
调用方法:对象.notify()
表示唤醒 对象 锁标记外面正在等待的所有线程



 

posted @ 2017-10-27 14:54  贩卖长江水  阅读(127)  评论(0编辑  收藏  举报