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基础(二) 自增自减与贪心规 ...
随机推荐
- P3809 【模板】后缀排序
P3809 [模板]后缀排序 从这学的 后缀数组sa[i]就表示排名为i的后缀的起始位置 x[i]是第i个元素的第一关键字 y[i]表示第二关键字排名为i的数,在第一关键字中的位置 #include& ...
- P3380 【模板】二逼平衡树(树套树)(线段树套平衡树)
P3380 [模板]二逼平衡树(树套树) 前置芝士 P3369 [模板]普通平衡树 线段树套平衡树 这里写的是线段树+splay(不吸氧竟然卡过了) 对线段树的每个节点都维护一颗平衡树 每次把给定区间 ...
- 关于er模型中的identifying relationship or non-identifying relationship
最近,主要负责项目管理和领域模型设计方面的工作,昨天在将UML类图转换为ER模型的时候,发现有identifying relationship or non-identifying relations ...
- linux 实时显示网速bash
执行方法先授权再运行 chmod +x shi.sh脚本+网卡名称 ./shi.sh ens33 #!/bin/bash while [ "1" ] do eth=$1 RXpre ...
- opencvbase 实现opencv打开摄像头和初步处理等效果操作(附源码)
// TwoCameraOnTimer2Dlg.cpp : 实现文件 /* CvMat, Mat, IplImage之间的互相转换 IpIImage -> CvMat CvMat mathead ...
- ubuntu18.04 安装新版本openssl
首先我们应该知道ubuntu18.04内置了1.1.0g版本的openssl: 使用下面的apt命令更新Ubuntu存储库并安装软件包编译的软件包依赖项: sudo apt update sudo a ...
- bzoj 2091 The Minima Game - 动态规划 - 博弈论
题目传送门 需要验证权限的传送门 题目大意 Alice和Bob轮流取$n$个正整数,Alice先进行操作.每次每人可以取任意多的数,得分是这一次取的所有数中的最小值.Alice和Bob都足够聪明,他们 ...
- smsService接口(dubbo接口)
package com.lakala.crosspay.jmeter.client.integration; import com.lakala.crosspay.sms.api.SmsService ...
- 前端 --- 7 Bootstrop框架
一.基本结构 1.下载地址 官方地址:https://getbootstrap.com 中文地址:http://www.bootcss.com/ 2.HTML基本搭建结构 <!DOCTYPE ...
- SpringCloud与Consul集成实现负载均衡
一.背景 SpringCloud微服务目前比较流行,其中大都在使用的服务注册与发现是Eureka,最近研究了Consul的集群搭建,现使用Consul实现服务的负载均衡.其主要拓扑结构如下: 二.Co ...