synchronized:内部锁
synchronized:内部锁
起源: 并行程序开发涉及多线程、多任务间的协作和数据共享
一)、内部锁:synchronized
1).定义在方法上
public synchronized void method()
当method方法被调用时,调用线程必须获得当前对象的锁。
锁对象:当前对象。
2).同步代码块
synchronized(Object obj){ }
锁对象:自定义一个共同使用的锁对象。
好处:
1.同步块可以更为精确的控制同步代码范围
2.小的代码块非常有利于锁的快进快出,假设同步块前后代码段较为耗时,而它
们又无需进行同步操作,那么,将这些代码纳入整个同步代码块就会增加锁的等
待时间。
3).静态方法的同步
public synchronized static method()
锁对象:Class对象
4).使用wait()、notify()来创建一个阻塞队列
构建:
方法一:当队列有数据时,取出第一个元素,没有数据时,线程进入等待状态,线
程被阻塞。
方法二:将一个对象添加进入队列,并通知等待的方法。
使用wait()、notify()实现了多线程之间的协作以及数据的共享。
模拟队列:
/**
* 使用synchronize和wait(), notify()实现一个阻塞队列
* 实现:
* 获取队列中的元素: 使用pop操作队列,当队列中有元素,则取出第一个元素,若队列为空,线程进入等待状态
* 使用put()方法添加元素,并唤醒等待的线程
*/
public class BlockQueue {
List list = new ArrayList<>();
public synchronized Object pop() throws InterruptedException {
//当涉及条件判断时,wait方法要在一个循环中使用,并指出跳出循环的条件
//原因:若使用if语句,线程被唤醒,直接执行接下的业务逻辑,不再进行list.size() == 0的判断,若之前队列的
//元素被消费,此时又再次唤醒该线程,队列中无数据,执行业务逻辑出错。
//将wait()放入while中,唤醒线程后会再次进行条件判断,条件满足则执行业务逻辑。
if(list.size() == 0) {
this.wait();
}
if(list.size() > 0){
System.out.println("取值");
return list.remove(0);
}else{
return null;
}
}
public synchronized void put(Object obj){
list.add(obj);
this.notify();
}
}
测试:
public class ThreadPoolTest {
public static void main(String[] args) {
BlockQueue queue = new BlockQueue();
//两个线程,一个线程获取队列的数据,如果队列有数据则获取数据,如果没有则等待
/**
* 使用线程池来创建线程对象
*/
ExecutorService executor = Executors.newFixedThreadPool(10);
//线程一,取数据
executor.execute(new Runnable(){
@Override
public void run(){
while(true) {
//获取队列的数据
try {
queue.pop();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
executor.execute(new PopThread(queue));
//线程二,放数据
executor.execute( new Runnable(){
@Override
public void run(){
while(true) {
String a = "1";
queue.put(a);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
}
synchronized:内部锁的更多相关文章
- 悲观的并发策略——Synchronized互斥锁
volatile既然不足以保证数据同步,那么就必须要引入锁来确保.互斥锁是最常见的同步手段,在并发过程中,当多条线程对同一个共享数据竞争时,它保证共享数据同一时刻只能被一条线程使用,其他线程只有等到锁 ...
- [多线程] 线程中的synchronized关键字锁
为什么要用锁? 在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实 ...
- Java内部锁的可重用性(Reentrancy)
Java提供了强制原子性的内部锁机制:synchronized块.但是内部锁是可重入的,当线程试图获得它自己占有的锁时,请求会成功. 简单的说,就是在一个synchronized方法内部调用本类的其他 ...
- 内部锁之一:锁介绍(偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景)
一.内部锁介绍 上篇文章<Synchronized之二:synchronized的实现原理>中向大家介绍了Synchronized原理及优化锁.现在我们应该知道,Synchronized是 ...
- synchronized到底锁住的是谁?
本文代码仓库:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sync 先来一道校招级并发编程笔试题 题 ...
- 由Java 15废弃偏向锁,谈谈Java Synchronized 的锁机制
Java 15 废弃偏向锁 JDK 15已经在2020年9月15日发布,详情见 JDK 15 官方计划.其中有一项更新是废弃偏向锁,官方的详细说明在:JEP 374: Disable and Depr ...
- synchronized类锁,对象锁,方法锁
synchronized从语法的维度一共有3个用法: 静态方法加上关键字 实例方法(也就是普通方法)加上关键字 方法中使用同步代码块 前两种方式最为偷懒,第三种方式比前两种性能要好. synchron ...
- Java多线程之synchronized线程锁
package org.study2.javabase.ThreadsDemo.sync; /** * @Auther:GongXingRui * @Date:2018/9/18 * @Descrip ...
- synchronized、锁、多线程同步的原理是咋样
先综述个结论: 一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能. 一般说synch ...
随机推荐
- python 可变数量参数 ( 多参数返回求 参数个数,最大值,最大值)
一. 自定义一串数字求 参数个数,最大值,最大值()---------方法一: def max(*a): m=a[0] p=a[0] n=0 for x in a: if x>m: m=x n+ ...
- 近万字案例:Rancher + VMware PKS实现全球数百站点K8S集群管理
Sovereign Systems是一家成立于2007年的技术咨询公司,帮助客户将传统数据中心技术和应用程序转换为更高效的.基于云的技术平台,以更好地应对业务挑战.曾连续3年提名CRN,并且在2012 ...
- ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 详解JavaScript调用栈、尾递归和手动优化
调用栈(Call Stack) 调用栈(Call Stack)是一个基本的计算机概念,这里引入一个概念:栈帧. 栈帧是指为一个函数调用单独分配的那部分栈空间. 当运行的程序从当前函数调用另外一个函数时 ...
- 远程控制服务(SSH)之Linux环境下客户端与服务端的远程连接
本篇blog将讲述sshd服务提供的两种安全验证的方法,并且通过这两种方法进行两台Linux虚拟机之间的远程登陆. 准备工作: (1) 准备两台安装有Linux系统的虚拟机,虚拟机软件采用VM ...
- UI控件拖动失效
问题描述:ui Slider滑块点击时需要特效,直接在滑块上添加OnPointerDown事件与OnPointerUp事件,但是当拖动时会直接触发OnPointerUp事件,而且拖动相关的事件失效 原 ...
- Java多线程(十五):CountDownLatch,Semaphore,Exchanger,CyclicBarrier,Callable和Future
CountDownLatch CountDownLatch用来使一个线程或多个线程等待到其他线程完成.CountDownLatch有个初始值count,await方法会阻塞线程,直到通过countDo ...
- 【原创】基于.NET的轻量级高性能 ORM - TZM.XFramework 之让代码更优雅
[前言] 大家好,我是TANZAME.出乎意料的,我们在立冬的前一天又见面了,天气慢慢转凉,朋友们注意添衣保暖,愉快撸码.距离 TZM.XFramework 的首秀已数月有余,期间收到不少朋友的鼓励. ...
- 蓝牙耳机没声音,用mac平台下的safari时
买了个蓝牙耳机,发现用其他本地播放器或者chrome的时候有声音, 但是用safari的时候没有声音,最后发现是flash的问题. 只要清除浏览数据后刷新就有声音了
- 在线热备份数据库之innobackupex 增量备份InnoDB
在线热备份数据库之innobackupex 增量备份InnoDB 什么是增量备份?其原理是什么? 增量备份是基于上一次备份后对新增加的内容进行备份,优点相较于完整备份而言备份内容少时间短,能够节省磁盘 ...