Java / Android 多线程和 synchroized 锁
s
AsyncTask 在Android R中标注了废弃
synchronized 同步
Thread:
thread.start()
public synchronized void start() {/*** This method is not invoked for the main method thread or "system"* group threads created/set up by the VM. Any new functionality added* to this method in the future may have to also be added to the VM.** A zero status value corresponds to state "NEW".*/if (threadStatus != 0)throw new IllegalThreadStateException();/* Notify the group that this thread is about to be started* so that it can be added to the group's list of threads* and the group's unstarted count can be decremented. */group.add(this);boolean started = false;try {start0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {/* do nothing. If start0 threw a Throwable thenit will be passed up the call stack */}}}private native void start0();
start0 是个native方法
进程和线程 进程> 线程
进程= 操作系统独立区域 ,可以有多条线程
进程和线程可以进行并行工作,线程依赖进程
Runable: 接口 重写run
new Thread(runnable)
thread.start(runnable) runnable在Thread内部标为target
相比于thread,runnable可以重用 : Thread1(runnable),Thread2(runnable)
ThreadFactory: Thread 工厂方法
private static void threadFactory() {AtomicInteger count = new AtomicInteger(0);ThreadFactory factory = new ThreadFactory() {@Overridepublic Thread newThread(Runnable r) {return new Thread(r,"Thread-"+count.incrementAndGet());}};Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}};Thread thread = factory.newThread(runnable);thread.start();Thread thread1 = factory.newThread(runnable);thread1.start();}
Executor: 接口
private static void executor() {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("runnable run");}};Executor executor = Executors.newCachedThreadPool();executor.execute(runnable);executor.execute(runnable);executor.execute(runnable);}
public interface Executor {/*** Executes the given command at some time in the future. The command* may execute in a new thread, in a pooled thread, or in the calling* thread, at the discretion of the {@code Executor} implementation.** @param command the runnable task* @throws RejectedExecutionException if this task cannot be* accepted for execution* @throws NullPointerException if command is null*/void execute(Runnable command);
}
newCachedThreadPool 返回 ExecutorService
void shutdown(); //关闭任务
List<Runnable> shutdownNow();//立即关闭 但是会调用intrat 用这个是安全的
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}
内部创建线程池,和连接池一样. 包含了线程的创建 销毁等操作 (0 //默认大小,当超过最大值Integer.MAX_VALUE,就会销毁到默认大小)
60L, TimeUnit.SECONDS,线程等待回收时间
new SynchronousQueue<Runnable>() 创建队列
Executor executor1 = Executors.newSingleThreadExecutor();创建1个线程
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}
newFixedThreadPool 创建固定数量的线程,不推荐,如果用得少或者不用也会是这么多,而且不可扩展更多,用来处理多个集中任务

newScheduledThreadPool:可以添加延迟
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);}
Callable:有返回值的Runnable ,方法 call : Type
private static void callable() {Callable<String> callable = new Callable<String>() {@Overridepublic String call() throws Exception {return "666";}};ExecutorService executorService = Executors.newCachedThreadPool();Future<String> future = executorService.submit(callable); //后台任务Future 否则就会阻塞主线程 execure则会阻塞进行等待try {String result = future.get(); //阻塞进行取值,System.out.println(result);} catch (ExecutionException | InterruptedException e) {throw new RuntimeException(e);}}if (future.isDone()){//如果完成任务}
流程图

线程同步:
public class SynchronizedDemo1 implements TestDemo{private boolean running =true;private void stop(){running = false;}@Overridepublic void runTest() {new Thread(new Runnable() {@Overridepublic void run() {int round = 1;while (running){}}}).start();try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}stop();}
}
看出会等待1秒然后跳出循环,但是实际上会一直执行
每个线程都有一块独立的区域,会把变量copy,然后改变值,然后再传回去

但是如果是多线程,copy同一个值,进行修改,数据会乱

可以使用 volatile ,改变其内存可见性,同步
多线程中如若用
x++; 则会进行两步 1 int temp = x+1, 2 x = temp 不是原子操作

需要使用 synchronized 有线程调用则其他线程等待
private synchronized void count(){x++;
}
AtomicInteger = int 的包装 增加原子性和同步性
AtomicInteger count = new AtomicInteger(0); //int
AtomicInteger count = new AtomicInteger(0); //intThreadFactory factory = new ThreadFactory() {@Overridepublic Thread newThread(Runnable r) {return new Thread(r,"Thread-"+count.incrementAndGet()); //++count// count.getAndIncrement() //count++}};
AtomicBoolean
private AtomicBoolean running = new AtomicBoolean(true);running.set(false);running.get()
除此之外还有

//同一个类如果有多个synchronized 一般就是有一个监视器 monitor 进行控制,只能由一个线程调用

可以再方法内部加上
synchronized (this){用当前监视器}
synchronized在方法上会同步锁多个方法,仅供当前线程调用
public class SynchronizedDemo3 implements TestDemo{private int x= 0;private int y = 0;private String name;private Object monitor1 = new Object();private Object monitor2 = new Object();private synchronized void count(int newValue){synchronized (monitor1){x = newValue;y = newValue;}}private void minus(int delta){synchronized (monitor1){x -= delta;y -= delta;}}//synchronized 锁住当前方法private synchronized void setName(String name){synchronized (monitor2){this.name = name;}}@Overridepublic void runTest() {}
}

synchronized 在方法上等同于在内部的 synchronized (this)
synchronized 作用 = 同步性,互斥
死锁:多线程中,当前线程持有的锁,但拿不到需要进行执行代码中的锁,会一直等待
乐观锁 写入时先读取, 悲观锁 -读之前加锁,写入前加锁, 主要用于数据库
static 修饰的方法 用synchronized在方法上 等同于 在方法内部( synchronized (name.class))
用当前类当做锁
单例模式双重检查锁 写法1

ReentrantLock 可重入锁 需要手动加解锁,同时也要注意是否能够正常解锁

可以使用读写锁
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();Lock readLock = lock.readLock();Lock writeLock = lock.writeLock();
线程安全本质是多个线程访问共同资源,在写入时,其他线程干预了,导致数据错误
锁机制是:对资源进行访问的一种限制
相关文章:
Java / Android 多线程和 synchroized 锁
s AsyncTask 在Android R中标注了废弃 synchronized 同步 Thread: thread.start() public synchronized void start() {/*** This method is not invoked for the main method thread or "system"* group threads created/set up by the VM. Any new functionali…...
基于51单片机的万年历-脉搏计仿真及源程序
一、系统方案 1、本设计采用51单片机作为主控器。 2、DS1302采集年月日时分秒送到液晶1602显示。 3、按键年月日时分秒,心率报警上下限。 4、红外对接管传感器采集心率送到液晶1602显示。 5、心率低于下限或高于上限,蜂鸣器报警。 二、硬件设计 原理图如…...
【ARFoundation学习笔记】点云与参考点
写在前面的话 本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。主要目的是为了加深记忆。其中难免出现纰漏,更多详细内容请阅读原文以及官方文档。 汪老师博客 文章目录 点云新建点云 参考点参考点的工作原理何时使用参考点使用参考点…...
uni-app:js实现数组中的相关处理-数组复制
一、slice方法-浅拷贝 使用分析 创建一个原数组的浅拷贝,对新数组的修改不会影响到原数组slice() 方法创建了一个原数组的浅拷贝,这意味着新数组和原数组中的对象引用是相同的。因此,当你修改新数组中的对象时,原数组中相应位置的…...
8 STM32标准库函数 之 实时时钟(RTC)所有函数的介绍及使用
8 STM32标准库函数 之 实时时钟(RTC)所有函数的介绍及使用 1. 图片有格式2 文字无格式二、RTC库函数固件库函数预览2.1 函数RTC_ITConfig2.2 函数RTC_EnterConfigMode2.3 函数RTC_ExitConfigMode2.4 函数RTC_GetCounter.2.5 函数RTC_SetCounter2.6 函数RTC_SetPrescaler2.7 函…...
ARMday04(开发版简介、LED点灯)
开发版简介 开发板为stm32MP157AAA,附加一个拓展版 硬件相关基础知识 PCB PCB( Printed Circuit Board),中文名称为印制电路板,又称印刷线路板,是重要的电子部件,是电子元器件的支撑体,是电子…...
国际腾讯云:云服务器疑似被病毒入侵问题解决方案!!!
云服务器可能由于弱密码、开源组件漏洞的问题被黑客入侵,本文介绍如何判断云服务器是否被病毒入侵,及其解决方法。 问题定位 使用 SSH 方式 或 使用 VNC 方式 登录实例后,通过以下方式进行判断云服务器是否被病毒入侵: rc.loca…...
Perl语言用多线程爬取商品信息并做可视化处理
首先,我们需要使用Perl的LWP::UserAgent模块来发送HTTP请求。然后,我们可以使用HTML::TreeBuilder模块来解析HTML文档。在这个例子中,我们将使用BeautifulSoup模块来解析HTML文档。 #!/usr/bin/perl use strict; use warnings; use LWP::User…...
认识计算机-JavaEE初阶
文章目录 一、计算机的发展史二、冯诺依曼体系(Von Neumann Architecture)三、CPU基本工作流程3.1 算术逻辑单元(ALU)3.2 寄存器(Register)和内存(RAM)3.3 控制单元(CU)3…...
you-get - 使用代码下载视频
文章目录 关于 you-get代码调用报错处理 源码简单分析 关于 you-get github : https://github.com/soimort/you-get you-get 是一个有名的开源视频下载工具包,这里不赘述。 代码调用 you-get 提供了命令行的方式下载视频,这里介绍使用 Python 调用源代…...
【Proteus仿真】【51单片机】汽车尾灯控制设计
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用按键、LED模块等。 主要功能: 系统运行后,系统运行后,系统开始运行,K1键控制左转向灯;…...
浙大恩特客户资源管理系统任意文件上传漏洞复现
0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统中fileupload.jsp接口处存在文件上传漏洞,未经身份认…...
史上第一款AOSP开发的IDE (支持Java/Kotlin/C++/Jni/Native/Shell/Python)
ASFP Study 史上第一款AOSP开发的IDE (支持Java/Kotlin/C/Jni/Native/Shell/Python) 类似于Android Studio,可用于开发Android系统源码。 Android studio for platform,简称asfp(爱上富婆)。 背景&下载&使用 背景 由…...
GCC + Vscode 搭建 nRF52xxx 开发环境
在 Windows 下使用 GCC Vscode 搭建 nRF52xxx 开发环境 ...... by 矜辰所致前言 最近有遇到项目需求,需要使用到 Nordic 的 nRF52xxx 芯片,还记得当初刚开始写博文的时候的写的 nRF52832 学习笔记,现在看当时笔记毫无逻辑可言,…...
Linux应用开发基础知识——Framebuffer 应用编程(四)
前言: 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。Frame 是帧的意 思,buffer 是缓冲的意思,这意味着 Framebuffer 就是一块内存,里面保存着 一帧图像。Framebuffer 中保存着一帧图像的每一个像素颜色值,假设…...
智安网络|数据库入门秘籍:通俗易懂,轻松掌握与实践
在现代信息化时代,数据库已成为我们日常生活和工作中不可或缺的一部分。然而,对于非专业人士来说,数据库这个概念可能很抽象,难以理解。 一、什么是数据库? 简单来说,数据库是一个存储和管理数据的系统。它…...
EXCEL中安装多个vsto插件,插件之间互相影响功能,怎么解决
在 Excel 中安装多个 VSTO 插件,并且这些插件之间存在互相影响的情况下,可以采取以下措施来解决问题: 1. **隔离插件功能:** - 确保每个 VSTO 插件都有清晰的功能和责任范围,避免不同插件之间的功能重叠。这可以通…...
Java枚举
枚举类 概念 Java中的枚举(Enumeration)是一种特殊的数据类型,它是一种包含固定常量的类型。枚举是一种更加类型安全和更易维护的方式来定义常量,它包含了一组命名的值。 enum Weekday {MONDAY, TUESDAY, WEDNESDAY, THURSDAY,…...
基于MATLAB的关节型六轴机械臂轨迹规划仿真
笛卡尔空间下的轨迹规划,分为直线轨迹规划和圆弧轨迹规划,本文为笛卡尔空间下圆弧插值法的matlab仿真分析 目录 1 实验目的 2 实验内容 2.1标准D-H参数法 2.2实验中使用的Matlab函数 3 全部代码 4 仿真结果 1 实验目的 基于机器人学理论知识&…...
双11狂欢最后一天
大家好,本年度双11即将到来,为了答谢大家多年来的支持及更广泛的推广VBA的应用,“VBA语言専功”在此期间推出巨大优惠:此期间打包购买VBA技术资料实行半价优惠。 1:面向对象:学员及非学员 2:打…...
避坑实录:手把手解决Ubuntu 18.04安装后找不到有线网络的Realtek驱动问题
避坑实录:Ubuntu 18.04下Realtek网卡驱动的深度解决方案 当你满怀期待地在新电脑上安装Ubuntu 18.04,却发现右上角根本没有有线网络图标时,那种感觉就像买了一辆跑车却发现没有方向盘。特别是当你知道问题出在Realtek网卡驱动上,却…...
ROFL-Player:英雄联盟回放分析终极指南 - 无需启动客户端的专业工具
ROFL-Player:英雄联盟回放分析终极指南 - 无需启动客户端的专业工具 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 你是否曾…...
Xilinx URAM深度实践:基于xpm_memory_tdpram原语构建高性能双端口存储模块
1. URAM基础与xpm_memory_tdpram原理解析 在FPGA开发中,存储资源的选择直接影响系统性能和资源利用率。Xilinx UltraRAM(URAM)是专为高性能应用设计的存储单元,相比传统BRAM,它具有更大的容量和更高的带宽特性。每个UR…...
Windows系统res-downloader证书配置实战指南:解决HTTPS资源嗅探难题
Windows系统res-downloader证书配置实战指南:解决HTTPS资源嗅探难题 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …...
Transformer跳跃连接原理与工程实践详解
1. 跳跃连接在Transformer模型中的核心价值我第一次在Vision Transformer中尝试引入跳跃连接时,准确率直接提升了7个百分点——这个结果让我意识到,这个看似简单的结构远比想象中重要。跳跃连接(Skip Connection)本质上是将神经网…...
基于cnn卷积网络的安全帽识别 深度学习安全帽佩头盔戴检测 工地安全检测
头盔检测 本项目旨在使用YOLOv8物体检测算法,在图像和视频中检测头盔。它提供了一个脚本,输入一个文件夹路径,检测该文件夹内所有图像和视频中的头盔,并将注释后的图像和包含检测信息的CSV文件保存到输出文件夹中。项目目标&#…...
M2LOrder模型联邦学习初探:在保护隐私下的多中心情感模型训练
M2LOrder模型联邦学习初探:在保护隐私下的多中心情感模型训练 想象一下,几家医院都想提升对患者反馈的分析能力,但谁也无法把自己的数据交给别人。数据是核心资产,也是敏感隐私,这个矛盾怎么破?今天我们就…...
避开这些坑!用GD32驱动CS5530做高精度称重,SPI配置与数据换算的实战经验
GD32与CS5530高精度称重系统开发避坑指南 在嵌入式称重系统开发中,GD32微控制器搭配CS5530 ADC的方案因其高性价比而广受欢迎。但实际开发过程中,从SPI通信配置到数据换算的每个环节都可能隐藏着影响精度的"陷阱"。本文将分享一套经过实际项目…...
Xftp 7不只是传文件:挖掘同步、直接编辑与图像预览这些被低估的高效功能
Xftp 7高阶技巧:解锁专业用户才知道的远程文件管理方案 当大多数用户还在用Xftp 7进行基础文件传输时,真正的效率高手已经将这套工具玩出了新花样。想象一下:前端设计师无需下载就能快速预览服务器上的图片素材,运维工程师直接在V…...
避开Verilog新手村陷阱:Hdlbits刷题时最容易犯的5个语法错误及调试技巧
避开Verilog新手村陷阱:Hdlbits刷题时最容易犯的5个语法错误及调试技巧 深夜的显示器前,你盯着Hdlbits的报错信息已经半小时——这已经是今晚第七次编译失败。Verilog语法看似简单,但那些隐藏在细节中的陷阱总能让初学者抓狂。本文将解剖五个…...
