Android基础学习(二十)—— 线程安全

news2024/11/19 9:24:37

1、Android中线程的常见用法

(1)继承 Thread

class MyThread extends Thread{
	@Override
	public void run(){
		//处理具体的逻辑
	}
}
new MyThread().start();   //启动此线程
//使用匿名类
new Thread(){
    @Override
	public void run(){
		//处理具体的逻辑
	}
}.start();

(2)实现 Runnable

class MyThread implements Runnable{
	@Override
	public void run(){
		//处理具体的逻辑
	}
}

MyThread myThread = new MyThread();
new Thread(myThread).start();
//使用匿名类
new Thread(new Runnable(){
    @Override
	public void run(){
		//处理具体的逻辑
	}
}).start();

2、线程的状态转换

在这里插入图片描述

3、线程安全

(1)定义

线程安全:这里讨论的线程安全,以多个线程之间存在共享数据访问为前提,它需要保证对对象单次的操作是线程安全的。

线程兼容:指对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境中可以安全地使用。比如,ArrayList 和 HashMap 等是线程兼容的。

(2)使用“互斥同步”来实现线程安全

同步:多个线程并发访问共享数据时,保证共享数据在同一时刻只被一条(或者一些,当使用信号量的时候)线程使用。

互斥:实现同步的一种手段,临界区、互斥量和信号量都是常见的互斥实现方式。

在Java中,最基本的互斥同步手段就是Synchronized关键字

Synchronized关键字:

  • 一种块结构的同步语法
  • 经过Javac编译之后,会在同步块的前后分别形成monitorenter和monitorexit这两个字节码指令。这两个字节码指令都需要一个reference类型的参数来指明要锁定和解锁的对象
  • 如果Java代码中的synchronized明确指定了对象参数,那就以这个对象的引用作为reference;如果synchronized修饰的方法类型是实例方法,取 ”代码所在的对象实例“ 来作为线程要持有的锁;如果synchronized修饰的方法类型是类方法,取 ”类的Class对象“ 来作为线程要持有的锁。
  • 在执行 monitorenter 指令时,首先要去尝试获取对象的锁,如果这个对象没被锁定,或者当前线程已持有该对象的锁,就把锁的计数器的值加一,而在执行 monitorexit 指令时,会将锁计数器的值减一。一旦计数器的值为零,锁随即就被释放了。(注意:被synchronized修饰的同步块对同一条线程来说是可重入的,即同一线程反复进入同步块也不会出现自己把自己锁死的情况)
  • 如果获取对象的锁失败,那当前线程就应当被阻塞等待,直到请求锁定的对象被持有它的线程释放为止。(注意:被synchronized修饰的同步块在持有锁的线程执行完毕并释放锁之前,会无条件地阻塞后面其他线程的进入)

4、ThreadLocal

实现线程本地存储的功能

ThreadLocal提供了一种与众不同的线程安全方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【加油站会员管理小程序】03 创建应用

我们上一篇介绍了数据源的创建,本篇我们介绍应用的创建。 微搭低代码中一共有两类应用,一类是数据模型应用,一类是自定义应用。数据模型应用往往对应着PC端的管理后台,例如我们的小程序通常需要一个管理后台来录入数据。 自定义…

【linux】2022年还能用,网易真的是良心啊,网易云音乐linux版本现在还是可以使用的超赞!!官方网的下载地址还可以使用,音乐使用的是qt5进行开发的。

目录前言1,关于网易云音乐2,可以正常使用,可以登录前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/128261513 未经博主允许不得转载。 博主CSDN地址是:https://blog.csdn.net/freewebsys 博主掘金地址…

vue.js:父子组件的实训案例

作业需求 需求1:定义两个输入框,通过输入框输输入的值改变页面显示的值需求2:改变第一个输入框的值的同时使得第二个输入框的值变为100倍并显示需求3:改变第二个输入框的值的同时使得第一个输入框的值变为1/100并显示 实训代码实…

CentOS搭建基于ZIPKIN的数据追踪系统

ZipKin入门介绍 Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。分布式跟踪系统还有其…

TinUI4.0发布

引言 TinUI4登场~~~ 更新一览: 优化radiobox效果修复listview返回元素不全的问题新增树状图 treeview使用TinUI LOGO.ico新增普通图片 image随包发布 TinUI帮助手册 实用程序,在\test目录下 修复 这是常规更新,修复了listview创建过程中…

ChatGPT怎么用

最开始了解ChatGPT居然是抖音上看到的,之前了解过GPT-3,最开始认为可能类似的语言模型,上手以后才发现,这玩意挺有意思,某些方面,比百度强,但是比人还差十万八千里,智力不好说&#…

【Proteus仿真】【STM32单片机】智能浴室水温调控仪设计

文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602、DS18B20、继电器加热、电机模块等。 系统运行后,LCD1602显示DS18B20采集温度值、温度上限阈值。 开启加水,一段…

PostgreSQL实战之物理复制和逻辑复制(四)

目录 PostgreSQL实战之物理复制和逻辑复制(四) 4 流复制监控 4.1 pg_stat_replication 4.2 监控主备延迟 4.3 pg_stat_wal_receiver PostgreSQL实战之物理复制和逻辑复制(四) 4 流复制监控 4.1 pg_stat_replication 主库上主…

Dual-Path Fusion:遥感融合

DPFN: A Dual-Path Fusion Network for Pan-Sharpening (一种用于泛锐化的双路径融合网络) 大多数现有深上用于pan-sharpening方法的几个公认的问题,如光谱失真和足够的空间纹理增强。针对这些问题,提出了一种新的双路径融合网络…

浙大全日制英文MBA项目申请的五大关键词

2023级开始,浙大全日制英文MBA项目全面登场!对于这个项目的了解,大多数考生还不是特别清楚,因为很多考生更加关注的是“全日制”而非英文MBA本身的情况,如果还是带着以往对中文全日制MBA项目的理解来申请这个项目&…

《Linux运维实战:使用Percona Server for MongoDB物理备份与恢复Mongodb数据》

一、备份与恢复方案 Percona Server for MongoDB 是一个免费的、增强的、完全兼容的、源代码可用的、带有企业级功能的MongoDB Community Edition的替代品。它不需要对MongoDB应用程序或代码进行更改。Percona Server for MongoDB支持版本 > 3.6 。 说明:当前环…

【通知】《生成对抗网络GAN原理与实践》代码开源,勘误汇总!

有三上个月出版了新书《生成对抗网络GAN:原理与实践》,Generative Adversarial Networks(中文名生成对抗网络,简称GAN)自从被提出来后,其发展就非常迅猛,几乎已经被应用于所有CNN可以使用的领域…

Js逆向教程21-vscode无环境联调

作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 Js逆向教程21-vscode无环境联调 一、环境安装 电脑安装visual code 电脑安装node.js 二、nodejs环境调试 vscode打开一个文件夹并创…

valet-windows

现在win可以用valet了,安装开始 环境参考 1》安装PHP 版本7.4.32 2》安装composer 2.4 安装valet 1》composer global require cretueusebiu/valet-windows 2》valet install 3》这里有2中方法,本人选择link valet link [name] 浏览器中输入 name.te…

[附源码]计算机毕业设计健身房预约平台Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

20221210英语学习

今日新词: authorize v.授权, 批准 layoff n.临时解雇, 操作停止, 活动停止期间 jazz adj.爵士音乐的, 不调和的, (色彩等)花哨恶俗的 overlap v.(与…)交叠,部分重叠;时间交叠;有共同之处 subject n.…

Matlab中的数据类型

数据类型 MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和
单元数组类型。这6种基本的数据类型都是按照数组形式存储和操作的。另外,MATLAB
中还有两种用于高级交叉编程的数据类型,分别是用户自定义的面向对象的用户类类型…

【考研数据】二.2021年BJTU计算机学院考研录取数据分析

欢迎订阅本专栏:《北交计算机复试经验》 订阅地址:https://blog.csdn.net/m0_38068876/category_12110003.html 【考研数据】一.2020年BJTU计算机学院考研录取数据分析【考研数据】二.2021年BJTU计算机学院考研录取数据分析【考研数据】三.2022年BJTU计算机学院考研录取数据分…

web端 无插件 实时视频预览

一,需求 项目需要在web上对相机采集的图片进行编码成视频,然后进行实时预览。以前调研的方案有以下两种: 1,客户端安装ocx插件,浏览器调用插件进行解码,渲染。但是浏览器支持有限,只有ie支持&…

【建议收藏】五年程序员写给小白看的Python基础知识

32000字的长文,建议先收藏后阅读,如果能够点赞转发那就太感谢啦~ 话不多说,我们正式开始。 安装 Python 在开始学习 python 之前,我们先要安装 python。安装 python 的步骤根据不同的操作系统会有些差异,以下是几种…