linux多线程访问共享资源,多个线程访问共享对象和数据

多个线程访问共享对象和数据有很多方式,但是可以分为两大类:1.多线程执行代码相同的。2.多线程执行代码不同的

对于多线程执行代码相同的情况来说:

1)使用同一个Runnable对象,在new Thread的时候放入相同的这个对象

public static void main(String[] args) {

Runnable r = new Runnable() {

int num = 100;

@Override

public synchronized void run() {

System.out.println(++num + "==add");

}

};

Thread t1 = new Thread(r);

Thread t2 = new Thread(r);

Thread t3 = new Thread(r);

t1.start();

t2.start();

t3.start();

}

对于多线程代码不同的情况来说:

1)将需要共享的对象或者数据放入另一个对象中,这个对象对外提供对其操作的方法,由不同的线程调用。

class Number {

int num = 100;

public int add() {

return ++num;

}

public int del() {

return --num;

}

}

Runnable对象中使用同一个Number对象

public static void main(String[] args) {

final Number num = new Number();

Runnable rAdd = new Runnable() {

@Override

public synchronized void run() {

System.out.println(num.add() + "==add");

}

};

Runnable rDel = new Runnable() {

@Override

public synchronized void run() {

System.out.println(num.del() + "==del");

}

};

Thread t1 = new Thread(rAdd);

Thread t2 = new Thread(rDel);

Thread t3 = new Thread(rAdd);

t1.start();

t2.start();

t3.start();

}

2)将Runnable写成内部类的形式,然后将需要共享的对象和数据写成外部类的成员变量。

class Number{

int num = 100;

Runnable r_add = new Runnable() {

@Override

public synchronized void run() {

System.out.println(++num+"==add");

}

};

Runnable r_del = new Runnable() {

@Override

public synchronized void  run() {

System.out.println(--num+"==del");

}

};

}

然后通过调用Number对象中的内部类对象来实现。

public static void main(String[] args) {

Number n = new Number();

Thread t1 = new Thread(n.r_add);

Thread t2 = new Thread(n.r_del);

t1.start();

t2.start();

}

------------------------------------------------------------------------------

还有一种方法简单粗暴,就是把需要共享的对象和数据用static修饰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux关闭交互模式,linux – 关闭cp(copy)命令的交互模式(cp:overwrite?)

推荐文章更新源的方法提前保存一下原来源 sudo cp sources.list sources.list.bak 换源命令: sudo gedit /etc/apt/sources.list 或者 sudo vim /etc/apt/sources.list 或者 sudo vim /etc/apt/sources.list推荐文章1 删除内容gg 顶部G 底部:set nu 显示行号:10,.d …

sql截去最后一位_SqlServer从左边 最后 中间截取字符串

SqlServer从左边 最后 中间截取字符串(摘录)2009-06-01 15:04已知: 字段AF:\photo\Winter Leaves.jpg要求:分段截取每段字符[字段A不能为TEXT类型,否则报错]解决方法:---截取字符串A的第一个\左边的字符串select left(A,charindex(/,A)-1) MEMO:charindex(\,A)-1 -在字符…

linux 解压tar.jz,linux系统压缩文件和解压缩命令

linux系统压缩文件和解压缩命令tar命令   解包:tar zxvf FileName.tar打包:tar czvf FileName.tar DirName gz命令   解压1:gunzip FileName.gz解压2:gzip -d FileName.gz压缩:gzip FileName.tar.gz 和 .tgz解压&a…

linux redis-4.0,Linux Redis 4.0.2 安装部署

Linux Redis 4.0.2 安装部署01 安装GCCyum -y install gcc gcc-c libstdc-devel tcl -y02 下载安装包cd /export/software/wget http://219.238.7.71/files/403400000ABE0C0C/download.redis.io/releases/redis-4.0.2.tar.gztar -zxvf redis-4.0.2.tar.gz -C ../serverscd /exp…

ncverilog脚本_NC-Verilog仿真详解

ncverilog仿真详解发表在ASIC/FPGA/汇编, 学习笔记, 编程开发 | 由阿布 | 十一月26, 2011 | 0标签: ncverilog, 仿真数位IC工具简介——Simulator 工具ModelSimModelSim是Mentor公司所推出的软体, 主要用来当作VHDL的模拟器, 也是目前CIC在VHDL方面的主要的模拟软体;但ModelSim…

android 串口一直打开_android 若何打开串口以及与串口通信

串口 若何 打开 通信 android android 串口通讯 androidusb转串口通讯 android 蓝牙串口通讯 android串口通讯demo ble串口通讯 android android 打开通讯录 android打开串口 android 打开串口失败 android如何打开串口串口通信,对于没接触过这方面的伴侣们&#xf…

海康9800平台linux的sdk,流媒体项目外包海康9800平台sdk适配

1. 整体流程图,见附件;2. 任务描述:1》海康9800平台sdk适配;需要研究信令协议及开发对接程序(登陆平台,获取设备的列表,开启实时预览,停止实时预览等);需要研究音视频流的传输协议及…

python假设税前工资和税率如下_Python来做假设检验

对于任何一个频率派的数据科学家而言,日常做数据分析难免还是会用到一些假设检验方法做一个数据探索和相关性、差异性分析,并且这也是做后续统计模型(机器学习类预测模型可以略过)预测的第一步。这篇博文目的就是整理基本的假设检验方法、适用条件和调用…

linux fall delay 10,Cell的Rise delay和Fall delay、Rise transition和fall transition

Cell的Rise delay和Fall delay、Rise transition和Fall transition介绍:如下图所示为一个Cell的lib中关于cell_rise/cell_fall、rise_transition/fall_transition的描述:在NLDM模型的.lib中,cell_rise/cell_fall它描述的是Cell从输入到输出的…

linux定时器无法重启pm2,pm2无法自动重启

Hawk 3. 网页采集器1.基本入门 1. 原理(建议阅读) 网页采集器的功能是获取网页中的数据(废话).通常来说,目标可能是列表(如购物车列表),或是一个页面中的固定字段(如JD某商品的价格和介绍,在页面中只有一个).因此 ...man asciiLinux 2.6 - man page for ascii (linu…

linux ps 详解 博客,Linux PS 命令 详解(转)

Linux操作系统PS命令详细解析(转)要对系统中进程进行监测控制,用 ps 命令满足你。/bin/psps 是显示瞬间行程的状态,并不动态连续;如果想对进程运行时间监控,应该用 top 工具。kill 用于杀死进程。ps 的参数说明l 长格式输出&#…

三维空间坐标的旋转算法详解_视觉slam | 三维空间刚体运动的五种表达:旋转矩阵 变化矩阵 欧拉角 旋转向量 四元数及互相转换...

原po:高翔slam十四讲-刚体运动1.旋转矩阵考虑一次旋转Before: 坐标系(e1,e2,e3), 向量(a1,a2,a3)After: 坐标系(e1,e2,e3), 向量(a1,a2,a3)即得到a Ra R 称为旋转矩阵(R是一个正交矩阵, 行列式为1) 考虑旋转平移欧拉定理(Euler’s rotation theorem&…

c语言 字符串相似度,某课程设计---文件相似度判断

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//返回两个文件操作是否都成功return ( result1 && result2 );}//功能:将数据存储到文件内//输入:const char * FileName----想写入数据的文件名// :const char * Data----想写入的数据//输出:无//返回值:布尔型---真表…

python2版本异常_Python to.exe引发异常:此项目的版本控制需要sdisttarb

我试图从Python文件构建一个可执行文件。我能纠正大多数错误,但现在我被这一个卡住了,我不知道如何改正它。我的程序与jiraapi交互。在我使用Cx_Freeze来构建具有以下设置的.exe。py文件:import sysimport setuptoolsfrom cx_Freeze import s…

layer 同步调用_关于Layer组件的同步以及减少GPU带宽的问题

本文主要为大家分享一篇P关于Layer组件的同步以及减少GPU带宽的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧。问题:1) Layer 之间能否进行单独更新,比如其中video 层上面弹出的状态栏场景如何优化&#…

keil流水灯c语言程序两个一起亮,我用keil c51编了一个流水灯程序,编译无误却只有第一和第二个灯亮了,最后停在第一个灯处不动...

满意答案zJ张俭2014.02.09采纳率:43% 等级:12已帮助:10469人你有几个错误:1 你的定时器没有重装,导致第一次中断和后面的中断时间不一样,第一次时间短,后面的时间一直是以65536个周期中断的.2 你在中断函数里用了 for 循环,for循环是一下子…

pyquery获取不到网页完整源代码_python动态网页爬取:爬取pexel上的图片

前言同样的,我们在写一个爬虫前要明确自己想要爬取的东西是什么,明确下载目标数据在浏览器的操作如何对于动态网页的爬取,在网页地址不变的情况下,我们首先要明确如何获取AJAX请求首先我们看看这个网站pexel打开页面后再Chrome浏览…

c语言或命题,求一个“输入一条命题公式(与或非条件,最好有双条件的)求真值表的程序”...

回复 2楼 hahayezhe我晕,现在就是让你帮忙,把一个表都输出来的系统啊。让你做一个系统啊大哥。参考以下程序:#include #include #define MAXNUM 100 //栈最大元素个数#define MAXEXP 30 //允许用户输入的表达式…

python进阶与数据操控_零基础机器学习Python进阶:Python操作MySql

阅读文本大概需要 6 分钟前言基础写了十篇,以后会继续更,这是第二篇进阶,文末会放上链接,进阶分成另一个系列,柠檬有时间会整理好菜单栏让大家更方便的阅读基础和进阶,柠檬会把自己在当时做的项目写到进阶里…

c语言每条代码的含义,为我解释一下,代码的意思。谢谢了。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #define LEN sizeof(struct student)struct student{long num;intscore;struct student *next;};struct student lista,listb;int n,sum0;int main(){struct student *creat(void);struct student *insert(struc…