首页 > 其他分享 >线程不安全能怎么办

线程不安全能怎么办

时间:2022-09-19 11:36:28浏览次数:86  
标签:加锁 synchronized Lock 安全 线程 公平 volatile 怎么办

一.volatile:轻量级解决“线程安全”的方案
1.作用:

  1. 禁止指令重排序
  2. 解决线程可见性的问题,实现原理是当操作完变量之后,强制删除掉线程工作内存中的此变量。
    注意事项:
    volatile不能解决原子性问题。

synchronized 加锁和释放锁 [ JVM 层面的解决方案,自动帮我们进行加锁和释放锁 ]

Lock手动锁[程序员自己加锁和释放锁]

synchronized注意事项:
在进行加锁操作的时候,同一组业务一定是同一个锁对象。
1.synchronized实现原理:
(1.)操作:互斥锁mutex
(2.)JVM中:帮我们实现的监视器锁的加锁和释放锁的操作。
(3.)在Java层面中:
a)锁对象mutex .
b)锁存放的地方:变量的对象头
2.synchronized说明
synchronized锁机制是非公平锁。
公平锁可以按顺序进行执行,而非公平锁执行的效率更高。
在Java中所有锁默认的策略都是非公平锁。
(1) JDK 1.6之前是使用重量级锁实现的,性能非常低,所以用的并不多。
(2)JDK 1.6对synchronized做了一个优化(锁升级) :
优化过程:无锁—》偏向锁(第一个线程第一次访问)—》轻量级锁(自旋)—》重量级锁(停止自旋,并且把当前没有获取到锁的线程放到等待队列里)
3.synchronized的使用场景(3种) :
1)使用 sylnclchronized 来修饰代码块(加锁对象可以自定义)
2)使用synchronized 来修饰静态方法、( 加锁对象是当前的类对象)

3)使用synchronized 可以用来修饰普通方法
(加锁对象是当前类的实例)

 

lock手动锁
Lock默认的锁策略也是非公平锁,但是Lock可以显示的声明为公平锁。

注意事项:一定要把lock()放在try外面

(1)如果将lock()方法放在try里面,那么当try里面的代码出现异常之后就会执行finally里面的释放锁的代码,但此时加锁还没有成功

(2)如果将lock()方法放在try里面,执行finally里面释放锁的代码的时候就会报错(线程状态异常),释放锁的异常会覆盖掉业务代码的异常报错,因此增加了排除错误的成本

volatile和synchronized 有什么区别?
A:volatile可以解决内存可见性问题和禁止指令重排序,但volatile不能解决原子性问题; synchronized 用来保证线程安全,也就是synchronized 可以解决任何关于线程安全的问题(关键代码排队执行,始终只有一个线程会执行加锁操作;原子性问题,指定重排序问题,原子性问题 )。
2. synchronized和Lock之间的区别?

synchronized既可以修饰代码块,又可以修饰静态方法或者普通方法;而Lock 只能修
饰代码块。
synchronized只有非公平锁的锁策略,而Lock既可以是公平锁也可以是非公平锁
(ReentrantLock默认是非公平锁,也可以通过构造函数设置true 声明它为公平锁)。
ReentrantLock更加的灵活(比如tryLock试图获取锁) 。
synchronized是自动加锁和释放锁的,而ReentrantLock 需要自己手动加锁和释放锁。
————————————————
版权声明:本文为CSDN博主「月亮的兔耳朵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_52012588/article/details/116725359

标签:加锁,synchronized,Lock,安全,线程,公平,volatile,怎么办
From: https://www.cnblogs.com/xiaoguo876/p/16707143.html

相关文章

  • SSL证书过期怎么办?别慌!SSL应急解决方案及注意事项来了
    当浏览器飘红显示网站不安全才发现网站SSL证书已过期,而此时又联系不上之前的SSL供应商,一时不知道该如何是好?幸好有前辈给予指导让快速解决SSL证书过期问题。特此分享出来,供......
  • Java安全之freemaker模版注入
    Java安全之freemaker模版注入freemaker简介FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具......
  • 《信息安全系统设计与实现学习笔记3》
    一、知识点归纳以及自己最有收获的内容1、知识点归纳总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?程序设计语言有3个......
  • Mysql 安全加固经验总结
    本文为博主原创,转载请注明出处:目录1.内网部署Mysql2.使用独立用户运行msyql3.为不同业务创建不同的用户,并设置不同的密钥4.指定mysql可访问用户ip......
  • 进程与线程的关系和区别
    进程与线程的关系和区别:(1)定义进程是具有一定独立功能的程序,关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个......
  • 2022-2023-1 20201324《信息安全系统设计与实现(上)》第10章
    目录0程序设计语言与shell脚本(1)一门程序设计语言有哪些必备的要素和技能(2)这些要素和技能在shell脚本中是如果呈现出来的1sh脚本2sh脚本与C程序3命令行参数4sh变量5sh......
  • Android多线程
    序言:线程和进程1、进程进程是指运行中的程序,比如我们使用QQ,就启动该进程分配内存空间。进程是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的......
  • 20201220蔡笃俊《信息安全系统设计与实现》第十章学习笔记
    一、任务内容自学教材第10章,提交学习笔记(10分)大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈......
  • 程序安全及规范化标准总结
    一、数据库部分1、数据表建字段时,除了主键id,其它字段都要设置为可为空;2、数据表中的表名和字段名,与程序中的表名和字段名,大小写要对应,高版本的mysql数据库默认开......
  • 【SQLServer】并行执行计划中的分支和线程
    SQLServer2012的执行计划增加了保留线程和并行执行计划的使用信息。例如下面的查询:SELECTBP.ProductID,cnt=COUNT_BIG(*)FROMdbo.bigProductASBPJOI......