千家信息网

Java并发synchronized用在方法上锁住的内容是什么

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容主要讲解"Java并发synchronized用在方法上锁住的内容是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java并发synchron
千家信息网最后更新 2025年01月19日Java并发synchronized用在方法上锁住的内容是什么

本篇内容主要讲解"Java并发synchronized用在方法上锁住的内容是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java并发synchronized用在方法上锁住的内容是什么"吧!

synchronized用在方法上锁住的是什么?

锁住的是当前对象的当前方法,会使得其他线程访问该对象的synchronized方法或者代码块阻塞,但并不会阻塞非synchronized方法。

脏读

一个常见的概念。在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的。注意这里 局部变量是不存在脏读的情况

public class ThreadDomain13{  private int num = 0;    public void addNum(String userName)  {    try    {      if ("a".equals(userName))      {        num = 100;        System.out.println("a set over!");        Thread.sleep(2000);      }      else      {        num = 200;        System.out.println("b set over!");      }      System.out.println(userName + " num = " + num);    }    catch (InterruptedException e)    {      e.printStackTrace();    }  }}

写两个线程分别去add字符串"a"和字符串"b":

public class MyThread13_0 extends Thread{  private ThreadDomain13 td;    public MyThread13_0(ThreadDomain13 td)  {    this.td = td;  }    public void run()  {    td.addNum("a");  }}public class MyThread13_1 extends Thread{  private ThreadDomain13 td;    public MyThread13_1(ThreadDomain13 td)  {    this.td = td;  }    public void run()  {    td.addNum("b");  }}

写一个主函数分别运行这两个线程:

public static void main(String[] args){  ThreadDomain13 td = new ThreadDomain13();  MyThread13_0 mt0 = new MyThread13_0(td);  MyThread13_1 mt1 = new MyThread13_1(td);  mt0.start();  mt1.start();}//看一下运行结果a set over!b set over!b num = 200a num = 200

按照正常来看应该打印"a num = 100"和"b num = 200"才对,现在却打印了"b num = 200"和"a num = 200",这就是线程安全问题。我们可以想一下是怎么会有线程安全的问题的:

1、mt0先运行,给num赋值100,然后打印出"a set over!",开始睡觉

2、mt0在睡觉的时候,mt1运行了,给num赋值200,然后打印出"b set over!",然后打印"b num = 200"

3、mt1睡完觉了,由于mt0的num和mt1的num是同一个num,所以mt1把num改为了200了,mt0也没办法,对于它来说,num只能是100,mt0继续运行代码,打印出"a num = 200"

分析了产生问题的原因,解决就很简单了,给addNum(String userName)方法加同步即可:

多线程线synchronized关键字加到方法上

public class ThreadDomain13{  private int num = 0;    public synchronized void addNum(String userName)  {    try    {      if ("a".equals(userName))      {        num = 100;        System.out.println("a set over!");        Thread.sleep(2000);      }      else      {        num = 200;        System.out.println("b set over!");      }      System.out.println(userName + " num = " + num);    }    catch (InterruptedException e)    {      e.printStackTrace();    }  }}

看一下运行结果:

a set over!a num = 100b set over!b num = 200

多个对象多个锁

在同步的情况下,把main函数内的代码改一下:

public static void main(String[] args){  ThreadDomain13 td0 = new ThreadDomain13();  ThreadDomain13 td1 = new ThreadDomain13();  MyThread13_0 mt0 = new MyThread13_0(td0);  MyThread13_1 mt1 = new MyThread13_1(td1);  mt0.start();  mt1.start();}

看一下运行结果:

a set over!b set over!b num = 200a num = 100

这里有一个重要的概念。关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁,这里如果是把一段代码或方法(函数)当作锁,其实获取的也是对象锁,只是监视器(对象)不同而已,哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,其他线程都只能呈等待状态。但是这有个前提:既然锁叫做对象锁,那么势必和对象相关,所以多个线程访问的必须是同一个对象。

如果多个线程访问的是多个对象,那么Java虚拟机就会创建多个锁,就像上面的例子一样,创建了两个ThreadDomain13对象,就产生了2个锁。既然两个线程持有的是不同的锁,自然不会受到"等待释放锁"这一行为的制约,可以分别运行addNum(String userName)中的代码。

synchronized(this)锁住的是什么?

锁住的是当前的对象。当synchronized块里的内容执行完之后,释放当前对象的锁。同一时刻若有多个线程访问这个对象,则会被阻塞。

synchronized(object)锁住的什么?

锁住的是object对象。当synchronized块里的内容执行完之后,释放object对象的锁。同一时刻若有多个线程访问这个对象,则会被阻塞。

这里需要注意的是如果object为Integer、String等等包装类时(new出的对象除外),并不会锁住当前对象,也不会阻塞线程。因为包装类是final的,不可修改的,如果修改则会生成一个新的对象。所以,在一个线程对其进行修改后,其他线程在获取该对象的锁时,该对象已经不是原来的那个对象,所以获取到的是另一个对象的锁,所以不会产生阻塞。

到此,相信大家对"Java并发synchronized用在方法上锁住的内容是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

对象 线程 方法 多个 运行 内容 代码 阻塞 两个 函数 关键 关键字 变量 情况 结果 问题 同步 不同 安全 字符 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全专用产品品牌目录 诛仙2经典服务器还能用吗 和平精英国际服务器能玩吗 华为怎么单独备份应用数据库 元旺网络技术集团 威联通服务器如何用手机登录 网络安全的外国电影 河南0基础学软件开发 常州网络安全答题入口 坪山区品质网络技术开发价格多少 亿链精选互联网生物科技有限公司 软件开发用户登录界面PB 软件开发的企业的税金 摄像机影响数据库文件破损 群晖nas服务器地址怎么看 射阳服务器和滨海服务区哪个大 如何通过数据库查看安装目录 数据库多个表连接顺序 华为服务器远程登录 中国快快网络技术有限公司 数据库考研有哪些专业 小喇叭下载软件开发 澳大利亚有哪些企业软件开发公司 由于网络安全隐患 多次登录用户锁定数据库设计 房地一体项目数据库自检报告范文 网络文明 网络安全 702研究所软件开发工资 软件开发后端是什么 云服务器安全解决方案
0