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()
表示唤醒 对象 锁标记外面正在等待的所有线程
JAVA基础知识总结:十九的更多相关文章
- Java基础知识学习(九)
GUI开发 先前用Java编写GUI程序,是使用抽象窗口工具包AWT(Abstract Window Toolkit).现在多用Swing.Swing可以看作是AWT的改良版,而不是代替AWT,是对A ...
- Java基础知识陷阱(十)
本文发表于本人博客. 上个星期由于时间比较紧所以未能继续写下去,今天再接再厉,专心 + 坚持这样离目标就越来越近了!废话少说说正题,今天我们还是来说说java中比较基础的知识,大家知道编写java程序 ...
- JAVA基础知识总结:九
二.面向对象特性之继承 1.什么是继承? 如果两个或者两个以上的类具有相同的属性和方法,我们可以抽取一个类出来,在抽取出来的类中声明各个类中公共的部分 被抽取出来的类-------父类,基类,超类 两 ...
- Java基础学习笔记十九 IO
File IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再 ...
- Java基础学习笔记十九 File
IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据 ...
- Java基础(二十九)Java IO(6)对象序列化(Object Serialization)
参考之前整理过的Java序列化与反序列化:https://www.cnblogs.com/BigJunOba/p/9127414.html 使用对象输入输出流可以实现对象序列化与反序列化,可以直接存取 ...
- Java基础笔记(十九)——抽象类abstract
抽象类作为父类,不能实例化自己类型的对象,但可以通过向上转型实例化子类对象. public abstract class Animal{ } 比如eat(); ,每个动物子类都应有自己的方法,那An ...
- Java基础知识陷阱系列
Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...
- 第二十九节:Java基础知识-类,多态,Object,数组和字符串
前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...
- java基础知识文章汇总
将之前的所有关于Java基础知识的随笔,整理成质量较高的十几篇随笔,几乎是好几篇比较零散的随笔合成现在的一篇,自认为还不错. java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规 ...
随机推荐
- Linux进程内存分析和内存泄漏定位
在Linux产品开发过程中,通常需要注意系统内存使用量,和评估单一进程的内存使用情况,便于我们选取合适的机器配置,来部署我们的产品. Linux本身提供了一些工具方便我们达成这些需求,查看进程实时资源 ...
- gcc对c++标准的支持
GCC 4.8.1完全支持c++11核心部分,对应的glibc为2.17 gcc 4.9支持c++11正则表达式,卧槽...4.8.5会报terminate called after throwing ...
- Ubuntu mysql数据库导入sql文件
在阿里云Ubuntu系统导入sql数据库文件 首先linux 下查看mysql相关目录 root@ubuntu14:~# whereis mysql mysql: /usr/bin/mysql--- ...
- linux下安装与部署redis
一.Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多 ...
- 20145208 蔡野 《网络对抗》Exp6 信息搜集与漏洞扫描
20145208 蔡野 <网络对抗>Exp6 信息搜集与漏洞扫描 本实践的目标是掌握信息搜集的最基础技能.具体有(1)各种搜索技巧的应用(2)DNS IP注册信息的查询 (3)基本的扫描技 ...
- Codeforces 437D The Child and Zoo - 树分治 - 贪心 - 并查集 - 最大生成树
Of course our child likes walking in a zoo. The zoo has n areas, that are numbered from 1 to n. The ...
- USB通信基础知识
1 USB系统组成 主机:提供USB接口和接口管理功能的硬件.软件.固件的复合体.PC机或OTG设备,一个USB系统只能有一个主机 设备:1.集线器HUB:扩展主机接口,设备可以通过其接入主机 2. ...
- Maven3版本的超级POM位置及中央仓库位置
背景 之所以想到这个问题,是因为在配置Nexus-Maven 私服的时候,需要在Maven的settings.xml中对<mirror>进行配置,在配置中央仓库的镜像时,<mirro ...
- POJ 1751 Highways 【最小生成树 Kruskal】
Highways Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23070 Accepted: 6760 Speci ...
- 论文笔记之:Optical Flow Estimation using a Spatial Pyramid Network
Optical Flow Estimation using a Spatial Pyramid Network spynet 本文将经典的 spatial-pyramid formulation ...