当前位置: 首页 > 编程日记 > 正文

两个线程同时访问一个变量_百战程序员:Java多线程对象及变量的并发访问

在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松。但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的。这样,一个对象同时被多个线程访问,会出现处理的结果和预期不一致的可能。因此,需要了解如何对对象及变量并发访问,写出线程安全的程序,所谓线程安全就是处理的对象及变量的时候是同步处理的,在处理的时候其他线程是不会干扰。

014c2821629e2863bfb566d9c86aaf24.png


synchronize同步方法
如果两个线程同时访问同一个对象的方法,不加控制,会出现意外的结果。通过用synchronize修饰方法,可以取得对象锁,那个线程先访问就先持有对象锁,其余的线程只能等待。
首先是没有用synchronize修饰的情况
public class HasSelfPrivateNum {
private int num = 0;
public void addI(String username){
try{
if (username.equals("a")){
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 (Exception e){
e.printStackTrace();
}
}
}
public class SelfPrivateThreadA extends Thread{
private HasSelfPrivateNum num;
public SelfPrivateThreadA(HasSelfPrivateNum num){
this.num = num;
}
@Override
public void run() {
super.run();
num.addI("a");
}
}
public class SelfPrivateThreadB extends Thread{
private HasSelfPrivateNum num;
public SelfPrivateThreadB(HasSelfPrivateNum num){
this.num = num;
}
@Override
public void run() {
super.run();
num.addI("b");
}
}
关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁,所以在上面的示例中,哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象。但如果多个线程访问多个对象,则JVM会创建多个锁。
“我们相信人人都可以成为一个IT大神,现在开始,选择一条阳光大道,助你入门,学习的路上不再迷茫。这里是北京尚学堂,初学者转行到IT行业的聚集地。"

相关文章:

AE 9.3代码 升级到AE10.0

下载的代码是AE 9.3,本机配置是AE 10.0 ,程序打不开,运行不了,提示找不到ESRI.ArcGIS.Controls.AxMapCongrol等等AE 控件。 具体解决方法: (1) 在引用中,重新添加ArcGIS引用&#xf…

mysql数据库主从同步过程详述(三)

续mysql数据库主从同步过程详述(二)在此说明下:在最后试验过程中,当查看从库状态的时候,IO_Running显示为no,从error_log中看到如下报错提示:120523 0:55:31 [Note] Slave I/O thread: connected to master rep192.168.1.5:3306, replication started in log mysql-bin.0000…

[No0000160]常用C# 正则表达式大全

正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串。正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法。Regex 类表示不可变(只读)的正则表达式。它还包含各种静态方法&#xff…

在VS中,如何新建项目,如何添加类库

学习了C#基础后就自己做了一个小小的qq空间,感觉挺好的。之后,由于团队需要被分配到测试方面去了,虽然测试时会看C#代码,但终究不是自己写的,没有那种深究的热情,尽管师兄说,看代码是最快提升的…

Python中requests包的安装

在使用pycharm开发的时候,我们经常需要导入一些包,但是这些包,我们事先并没有安装,一个显著的现象就是我们在pycharm中导入一个包时,系统提示不存在,那就是我们没有安装这个包。举一个例子,我在…

python fft库有哪些_Python图像处理库PIL中快速傅里叶变换FFT的实现(一)

离散傅里叶变换(discrete Fouriertransform)傅里叶分析方法是信号分析的最基本方法,傅里叶变换是傅里叶分析的核心,通过它把信号从时间域变换到频率域,进而研究信号的频谱结构和变化规律。FFT是一种DFT的高效算法,称为快速傅立叶变…

转: Android ListView 滑动背景为黑色的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然…

BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树

题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i1],a[i2]……a[j]中第k小的数是多少(1≤k≤j-i1),并且,你可以改变一些a[i]的值,改变后&#…

Git与github基本操作

一. git安装与简单配置 1. git的安装 首先进入git的官方网站git-scm.com 下载自己电脑对应的git版本,然后点击安装即可 点击上图的红色部分进行下载 安装的时候直接默认即可 找到你的Git安装位置,把快捷方式中的git bash发送到桌面&#xff0…

容器 root权限运行_【漏洞通告】Containerd容器逃逸漏洞通告 (CVE202015257)

2020年12月1日,Containerd发布更新,修复了一个可造成容器逃逸的漏洞CVE-2020-15257,并公开了相关说明。通过受影响的API接口,攻击者可以利用该漏洞以root权限执行代码,实现容器逃逸。深信服安全研究团队依据漏洞重要性…

IOS成长之路-NSMutableURLRequest实现Post请求

NSData *bodyData [[bodyString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]dataUsingEncoding:NSUTF8StringEncoding];//把bodyString转换为NSData数据 NSURL *serverUrl [[NSURL URLWithString:RequestUrl] URLByAppendingPathComponent:urlStr];//获…

rsync ssh文件同步

参考链接 下载 manual #rsync -avP -e ssh ./filename root192.68.1.38:/root/paths/ (本地到远程) #rsync -avP -e ssh root192.68.1.38:/root/paths/test.tar.gz /root /paths (远程到本地) rsync -av --progress --inpl…

【转】Linux思维导图

【原文】https://www.toutiao.com/i6591690511763898888/ 1、Linux学习路径: 2、Linux桌面介绍: 3、FHS(文件系统目录标准): 4、Linux需要特别注意的目录: 5、Linux 内核学习路线: 6、Linux Security Coaching&#xf…

Python中lxml库的安装(Windows平台)

之前写过《Python中requests包的安装》,今天我需要安装lxml库,这里我尝试之前安装requests方式,但是没有成功,几经周折,终于总结出来了一个方法,这里拿出来给大家分享。 首先就是自己的电脑已经安装好了Py…

hadoop fs命令无法使用_「大数据」「Hadoop」HDFS的配置与管理

HDFS(Hadoop Distributed File System)是Hadoop三个基础组件之一,为另外的组件以及大数据生态中的其他组件提供了最基本的存储功能,具有高容错、高可靠、可扩展、高吞吐率等特点。HDFS运行在java环境中,因此我们都需要安装JDK。安装完成之后是…

Oracle 触发器 Update 不能操作本表的疑问

今天要解决一个需求,类似表A有个字段叫flag存储的是0 or 1 ,当一行记录更改为1的时候,其他行同字段要变为0。 这样的需求第一个思路想尝试下能否用触发器来实现 create or replace trigger tr_equiptreeweatherstation before UPDATE ON con…

前景检测算法_3(GMM)

摘要 本文通过opencv来实现一种前景检测算法——GMM,算法采用的思想来自论文[1][2][4]。在进行前景检测前,先对背景进行训练,对图像中每个背景采用一个混合高斯模型进行模拟,每个背景的混合高斯的个数可以自适应。然后在测试阶段&…

ADO.Net五个对象

Connection Command DataAdapter DataSet DataReader 取5个单词的首字母CCDDD,在拼音输入法里面打一下,出来5个字,然后就记忆为曹操打豆豆。 制作了一张图片,用来帮助记忆曹操打豆豆。 Reference ADO.NET的五大对象转载于:ht…

XPath与多线程爬虫

一. Xpath的介绍与配置 1. XPath是什么 XPath是一门语言 XPath可以在XML文档中查找信息 XPath支持HTML XPath通过元素和属性进行导航 总结: XPath可以用来提取信息(和正则表达式类似) XPath比正则表达式更加厉害 XPath比正则表…

html无序列表空心圆_列表样式的使用CSS入门基础(018)

今天我们分享关于列表样式的内容。列表项list-sytle-type:在HTML学习中,我们知道有有序列表和无序列表,都是使用type属性来定义的。1、有序列表有序列表 有序列表 有序列表 属性值type:1,数字1、2、3……&#xff1b…

2013年3月百度之星B题

Sigma Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Problem Description 小H是一个程序员。他很喜欢做各种各样的数学题,尤其喜欢做《水泥数学》。 在看了《水泥数学》的2.5章后,小H终于会用9种计算 1^22^2...n^…

TCP/IP 10.1集成IS-IS协议

樱桃小小的 软软的甜甜的好吃哈&#xff01;感谢上帝 &#xff0c; 恩呢 &#xff0c; 让我吃的这么满足&#xff0c;开心&#xff01;第十章 集成IS-IS协议建议在学习ISIS的时候联系2个<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office"…

运维基础-文件权限管理

Linux是一个多用户操作系统&#xff0c;在多用户操作系统上我们需要一种方法来允许或者拒绝访问特定的文件和目录。文件有所属人和相关的单个组。我们可以设置所属人或者租的权限&#xff0c;以及所有其他人的权限。 文件只具有三个应用权限的用户类别。文件的所有者&#xff0…

android帧动画实现方法之一

好多动画离不开帧动画的使用&#xff0c;下面就实现帧动画的制作方式之一&#xff0c;以后会推出其他方法。 上面是文件存放位置。 a.xml文件的代码如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <animation-list xmlns:android"…

python技术晨讲_python系列教程14

声明&#xff1a;在人工智能技术教学期间&#xff0c;不少学生向我提一些python相关的问题&#xff0c;所以为了让同学们掌握更多扩展知识更好的理解人工智能技术&#xff0c;我让助理负责分享这套python系列教程&#xff0c;希望能帮到大家&#xff01;好了&#xff0c;是开始…

三字母词和转义字符

1. 三字母词 在C语言中有一种三字母词的说法&#xff0c;trigraph sequences&#xff0c;目前为止有九种三字母词&#xff0c;如下 ?? # ??) ] ??! | ??( [ …

写了个Python脚本监控nginx进程

写了个Python脚本监控nginx进程 Xiaoxia[PG]写了个Python脚本监控nginx进程接上一文用iptables让SSH服务对陌生人说不。还是有点担心这个学期内&#xff0c;nginx可能会因为系统各种原因而出现异常退出&#xff0c;导致Web服务暂停。所以&#xff0c;又来了一个方案。view pla…

Linux shell 脚本报错:/bin/bash^M: bad interpreter: No such file or directory

今天遇到一个很诡异的问题&#xff0c;一直运行很正常的shell脚本失败了&#xff0c;只是昨天增加了一个参数而已。 报错信息&#xff1a; /bin/bash^M: bad interpreter: No such file or directory 后来发现root cause, 昨天修改文件的时候在windows中修改保存&#xff0c;然…

C语言volatile关键字详解

volatile提醒编译器它后面所定义的变量随时都有可能改变&#xff0c;因此编译后的程序每次需要存储或读取这个变量的时候&#xff0c;都会直接从变量地址中读取数据。如果没有volatile关键字&#xff0c;则编译器可能优化读取和存储&#xff0c;可能暂时使用寄存器中的值&#…

python储存数据的容器_Python基础四容器类数据

一、上周内容回顾int bool str 之间的互相转换int str:str(int)int(str) #字符串必须是数字组成int bool:bool(int):非零即TrueTrue --->1 Fasle --->0bool str:str-->bool #非空即Truestr&#xff1a;BIF自己去背吧二、列表why&#xff1a;1.取值费劲。2.对字符串…