54.怎么实现线程的安全
54.怎么实现线程的安全
1.对于线程不安全的对象我们可以通过如下方法来实现线程安全:
1: 加锁
利用Synchronized或者ReenTrantLock来对不安全对象进行加锁,来实现线程执行的串行化,从而保证多线程同时操作对象的安全性,一个是语法层面的互斥锁,一个是API层面的互斥锁.
2: 非阻塞同步来实现线程安全。
原理就是:通俗点讲,就是先进性操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享数据有争用,产生冲突,那就再采取其他措施(最常见的措施就是不断地重试,直到成功为止)。这种方法需要硬件的支持,因为我们需要操作和冲突检测这两个步骤具备原子性。通常这种指令包括CAS SC,FAI TAS等。
3:线程本地化,
一种无同步的方案,就是利用Threadlocal来为每一个线程创造一个共享变量的副本来(副本之间是无关的)避免几个线程同时操作一个对象时发生线程安全问题。
2.既然这里说到了多线程,那我们就来说说多线程中一些常见的问题吧
先说一下线程的基本概念,线程的基本状态以及状态之间的关系
线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
Java中的线程有四种状态分别是:运行、就绪、挂起、结束
实现线程的方法,有什么区别:
一是继承Thread,二是实现Runnable接口。
启动方法不一样。
Thread1继承,Thread2实现Runnable接口,
则启动一个Thread1线程可以使用new Thread1().start(),
而启动Thread2线程则new Thread(new Thread2()).start()。
可以使用run方法启动一个线程吗?
启动一个线程应该使用start方法,
线程的run方法可以直接调用,但是不会启动一个新的线程,只是在原来的线程中调用了run方法而已。
sleep()方法和wait()方法的区别:
sleep()是线程的静态方法,使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不可以访问共享数据。
wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。
简单来说就是:
sleep():是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait():是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
请说出你所知道的线程同步的方法。
同步的实现方面有两种,分别是synchronized,wait与notify
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
notifyAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
54.怎么实现线程的安全相关推荐
- iOS-多线程 ,整理集锦,多种线程的创建
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)lau ...
- Java并发包--线程池框架
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509903.html 线程池架构图 线程池的架构图如下: 1. Executor 它是"执行者 ...
- Android 查看当前应用的线程数是否超限
1.查看某个应用(以com.wwy.setup为例)的进程号 使用包名查找 adb shell "ps | grep packageName",packageName 也可以是包名 ...
- 孤荷凌寒自学python第三十九天python 的线程锁Lock
孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...
- oracle 11g 从rman全备中恢复控制文件,拥有RMAN全备(缺少后增文件),丢失全部数据文件,控制文件的恢复...
1.做一个RMAN的全备 E:\oracle\rman_scripts>rman catalog target 恢复管理器: Release 10.2.0.1.0 - Production on ...
- HandlerThread
一.概念 1.Android中Handler的使用,一般都在UI主线程中执行,因此在Handler接收消息后,处理消息时,不能做一些很耗时的操作,否则将出现ANR错误. 2.HandlerTh ...
- 并发编程面试题(2021最新版)
目录 基础知识 并发编程的优缺点 为什么要使用并发编程(并发编程的优点) 并发编程有什么缺点 并发编程三要素是什么?在 Java 程序中怎么保证多线程的运行安全?并发编程三要素(线程的安全性问题体现在 ...
- Java并发编程面试题(2020最新版)
转载自 Java并发编程面试题(2020最新版) 基础知识 并发编程的优缺点 为什么要使用并发编程(并发编程的优点) 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到 ...
- 多线程编程指南 part 2
多线程编程指南 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA95054 U.S.A. 文件号码819–7051–10 2006 ...
最新文章
- 2012年我的十大工程9——形象工程
- KDD 2021 | Neural Auction: 电商广告中的端到端机制优化方法
- [芦半山]Binder的异常机制
- c++byte数组和文件的相互转换_终于!word、excel、ppt文件相互转换技巧来了!
- MySQL用户管理和权限管理
- Windows Phone开发(8):关于导航的小技巧
- 大学课程 | 《微机原理与接口技术》知识点总结
- java工具类解压缩zip和rar
- Android 3D画廊
- 阿米洛键盘失灵_机械键盘按键失灵维修,这里有个案例给你一些思路。
- Balancer均衡器时段设置
- 计算机无法检测更新失败怎么办,Windows更新错误解决方案
- Excel | 替换特定大小的单元格值(如:小于5000的值)为指定值
- 2022年系统集成项目管理工程师考试,需要知道这些
- 网络资源的定义--URI,URL,URN
- python采用强制缩进的方式是代码具有极佳的可读性_python入门
- ZOJ 4062 Plants vs. Zombies(二分)
- UOS系统升级到1050后无法正常使用输入法功能问题解决方法
- spark(kryo)、hadoop(writable)、jdk(serializable)-序列化
- Java常用工具类库
热门文章
- css中涉及到的百分比
- 利用Register protocol实现网页调用桌面程序(类似迅雷、QQ等)
- 学python多大年龄可以学车_考驾照最大多少多大年龄可以报名
- 算法题 求第K大的数
- CentOS 7安装和简单配置ss5
- 吊死鬼游戏Hangman游戏的C语言实现代码
- 吉林大学设计模式第三次作业(下)
- php静态构造函数,PHP __construct():构造函数/方法
- python什么是鸭子类型
- 全文检索与ElasticSearch(一)——ES概述,正向索引与倒排索引,B+树,简单命令,Mapping