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:内部锁的更多相关文章

  1. 悲观的并发策略——Synchronized互斥锁

    volatile既然不足以保证数据同步,那么就必须要引入锁来确保.互斥锁是最常见的同步手段,在并发过程中,当多条线程对同一个共享数据竞争时,它保证共享数据同一时刻只能被一条线程使用,其他线程只有等到锁 ...

  2. [多线程] 线程中的synchronized关键字锁

    为什么要用锁? 在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实 ...

  3. Java内部锁的可重用性(Reentrancy)

    Java提供了强制原子性的内部锁机制:synchronized块.但是内部锁是可重入的,当线程试图获得它自己占有的锁时,请求会成功. 简单的说,就是在一个synchronized方法内部调用本类的其他 ...

  4. 内部锁之一:锁介绍(偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景)

    一.内部锁介绍 上篇文章<Synchronized之二:synchronized的实现原理>中向大家介绍了Synchronized原理及优化锁.现在我们应该知道,Synchronized是 ...

  5. synchronized到底锁住的是谁?

    本文代码仓库:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sync 先来一道校招级并发编程笔试题 题 ...

  6. 由Java 15废弃偏向锁,谈谈Java Synchronized 的锁机制

    Java 15 废弃偏向锁 JDK 15已经在2020年9月15日发布,详情见 JDK 15 官方计划.其中有一项更新是废弃偏向锁,官方的详细说明在:JEP 374: Disable and Depr ...

  7. synchronized类锁,对象锁,方法锁

    synchronized从语法的维度一共有3个用法: 静态方法加上关键字 实例方法(也就是普通方法)加上关键字 方法中使用同步代码块 前两种方式最为偷懒,第三种方式比前两种性能要好. synchron ...

  8. Java多线程之synchronized线程锁

    package org.study2.javabase.ThreadsDemo.sync; /** * @Auther:GongXingRui * @Date:2018/9/18 * @Descrip ...

  9. synchronized、锁、多线程同步的原理是咋样

    先综述个结论: 一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能. 一般说synch ...

随机推荐

  1. python学习-文件I/O

    12.2使用os.path操作目录 # os.path_test.py import os import time print(os.path.abspath("abc.txt") ...

  2. C#基础操作符详解(上)

    本节内容: 1.操作符概览: 2.操作符的本质: 3.操作符与运算顺序 4.操作符详解. 1.操作符概览: 操作符(Operator)也译为”运算符” 操作符是用来操作数据的,被操作符操作的数据称为操 ...

  3. 后缀数组(SA)

    学习了LRJ神犇的代码.orz. 首先真心建议了解下基数排序!!且要有一定的c++程序经验,否则程序很难看懂. 然后对着下面的程序调试(假装你已经会了算法思想) 弄个一个礼拜一下午就能学会了. 该算法 ...

  4. 介绍Webflux

    介绍Webflux 关于WebFlux 我们知道传统的Web框架,比如说:struts2,springmvc等都是基于Servlet API与Servlet容器基础之上运行的,在Servlet3.1之 ...

  5. Spring框架 --- 深入

    1.Spring IOC IOC技术: 控制反转,也叫(依赖注入) 控制反转:Bean的生命周期不受你控制,而是交给Spring容器管理. Spring框架如何利用IOC ?:        实现了控 ...

  6. Sqoop的安装和验证

    Sqoop是一个用来完成Hadoop和关系型数据库中的数据相互转移的工具,它可以将关系型数据库中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库中. Kafka是一个开源 ...

  7. dom 创建时间

    下面讲述如何在页面生成一个装有日期的盒子 首先写出一个日期的函数进行赋值使用document.createElement创建一个文档节点div,然后将时间函数输出在div之中,利用document.b ...

  8. vue---Excel表格导出

    一.安装依赖 npm install file-saver --save npm install xlsx --save npm install script-loader --save-dev 二. ...

  9. 小白学 Python(15):基础数据结构(集合)(下)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  10. Vs使用EF来操作MySql(经验 )

    1.安装Vs2015,至少是2012以上版本才行 2. 安装 这个是用于连接Mysql数据库的Vs插件 2.1通过这种方式添加引用 3.配置数据库 // // // 4.添加实体 注:这里最好从数据库 ...