首页 > 编程语言 >Java学习笔记------线程安全问题

Java学习笔记------线程安全问题

时间:2022-12-27 22:22:57浏览次数:33  
标签:同步 Java synchronized lock 线程 ------ 监视器 方法

线程的安全问题

同步机制解决线程安全问题

方式一:同步代码块
synchronized(obj){
	// 需要被同步的代码
}
synchronized(this){
}
synchronized(Windows.class){
    
}

注:

  1. 操作共享数据的代码,即为需要被同步的代码
  2. 同步监视器,俗称:锁。
  3. 任何一个类的对象,都可以充当锁,要求多个线程必须要共用同一把锁
    • 补充:在实现Runnable接口创建多线程方式中,我们可以考虑使用this充当同步监视器
方式二:同步方法

如果操作的共享数据的代码完整的声明在一个方法中,我们不妨将此方法声明同步的

public synchronized void 方法名(){}
// 使用同步方法解决继承Thread类的线程问题
public static synchronized void 方法名(){}

  • 同步方法仍然设计了同步监视器,只是不用显式的声明
  • 非静态的同步方法,同步监视器:this
  • 静态的同步方法,同步监视器:类名.class
方式三:JDK5.0新增 --------> Lock锁
private ReentrantLock lock = new ReentrantLock();
try{
    // 调用lock()
    lock.lock();
    ...
}finally{
    //调用解锁方法unlock()
    lock.unlock();
}

同步的方式,解决了线程的安全问题,但解决同步代码时,只能有一个线程参与,其他线程等待,相当于是一个单线程的过程,效率低。

线程的死锁问题

解决方法:

  • 专门的算法、原则
  • 尽量减少同步资源的定义
  • 尽量避免嵌套同步

面试题:synchronized 与 Lock 的异同?

同:二者都能解决线程安全问题

异:

  • synchronized机制在执行完相应的同步代码以后,会自动的释放同步监视器
  • Lock 需要手动的启动同步(Lock()),同时结束同步需要手动的实现(unlock(())

标签:同步,Java,synchronized,lock,线程,------,监视器,方法
From: https://www.cnblogs.com/LruiBlog/p/17009135.html

相关文章

  • 实验五
    任务1#include<stdio.h>#include<string.h>#defineN3typedefstructstudent{intid;charname[20];charsubj......
  • Java学习笔记----线程基础
    线程线程,进程可进一步细化为线程,是一个程序内部的一条执行路径线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器,线程切换的开销小线程的创建与启动Java......
  • Vue3之toRaw 与 markRaw
    toRaw与markRawtoRaw:作用:将一个由reactive生成的响应式对象转为普通对象。ref的对象不行使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引......
  • csrf与auth认证
    目录csrf与auth认证今日内容概要今日内容详细csrf跨站请求伪造csrf校验策略csrf相关装饰器auth认证模块csrf与auth认证今日内容概要csrf跨站请求伪造csrf校验策略csr......
  • Node.js与npm
    Node.js与内置模块什么是Node.jsNode.js®isaJavaScriptruntimebuiltonChrome'sV8JavaScriptengine.Node.js是一个基于ChromeV8引擎的JavaScript运行......
  • React项目中使用装饰器报错
    在初次使用React的装饰器时,第一次在项目中使用@会报错,原因是react默认是不支持装饰器的,所以才会报错,所以是需要做一些配置来支持装饰器。安装插件yarnadd-Drea......
  • 实验任务6
    #include<stdio.h>#include<stdlib.h>intmain(){charcr;FILE*fp;longcount;if((fp=fopen("data4.txt","r"))==NULL){printf("Can'tope......
  • Vue3之readonly 与 shallowReadonly
    readonly与shallowReadonlyreadonly:让一个响应式数据变为只读的(深只读)。shallowReadonly:让一个响应式数据变为只读的(浅只读)。应用场景:不希望数据被修改时。示......
  • MySql-防止注入-2022-12-27
    packagecom.kuang.lesson02;importcom.kuang.lesson02.utils.JdbcUtils;importjava.sql.Connection;importjava.util.Date;importjava.sql.PreparedStatement;import......
  • AcWing. 1165.单词环
    传送门解题思路\(\qquad\)我们一开始可以得出一个建图的思路,对于每个字符串我们把它们当成图中的一个点,然后能“接龙”的字符串之间连一条边,在这张图上跑\(01\)分数规划......