使用synchronized对并发性的影响
1 前言
- 非静态方法的同步锁是当前对象(this)(对象锁)
- 静态方法的同步锁是当前类的字节码(类锁)
- 不同的锁之间能并发
2 同一对象内
本节主类与资源类如下:
class Resorce{ //资源
static int x=0;
static int y=0;
}
public class Main {
public static void main(String[] args) {
Operate op=new Operate();
Thread t1=new Thread() {
public void run() {
op.fun1();
}
};
Thread t2=new Thread() {
public void run() {
op.fun2();
}
};
t1.start();
t2.start();
}
}
2.1 两个非static方法,一个被synchronized修饰,一个未被修饰,能否并发?(能并发)
(本例中两个方法访问同一资源,能并发;若访问不同资源,也能并发)
class Operate{
void fun1() {
for(int i=0;i<3;i++) {
Resorce.x++;
for(int j=0;j<1000;j++); //延时
System.out.println("t1-uux:"+Resorce.x);
}
}
synchronized void fun2() {
for(int i=0;i<3;i++) {
Resorce.x++;
for(int j=0;j<1000;j++); //延时
System.out.println("t2-sux:"+Resorce.x);
}
}
}
运行结果:
t1-sux:2
t2-uux:2
t2-uux:4
t1-sux:3
t1-sux:6
t2-uux:5
sux:被synchronized修饰,未被static修饰,资源为x;
uux:未被synchronized修饰,未被static修饰,资源为x。
2.2 两个非static方法,都被synchronized修饰,能否并发?(不能并发)
(本例中两个方法访问不同资源,不能并发;若访问同一资源,也不能并发)
class Operate{
synchronized void fun1() {
for(int i=0;i<3;i++) {
Resorce.x++;
for(int j=0;j<1000;j++); //延时
System.out.println("t1-sux:"+Resorce.x);
}
}
synchronized void fun2() {
for(int i=0;i<3;i++) {
Resorce.y++;
for(int j=0;j<1000;j++); //延时
System.out.println("t2-suy:"+Resorce.y);
}
}
}
运行结果:
t1-sux:1
t1-sux:2
t1-sux:3
t2-suy:1
t2-suy:2
t2-suy:3
sux:被synchronized修饰,未被static修饰,资源为x;
suy:被synchronized修饰,未被static修饰,资源为y。
2.3 两个synchronized方法,一个被static修饰,一个未被修饰,能否并发?(能并发)
(本例中两个方法访问同一资源,能并发;若访问不同资源,也能并发)
class Operate{
synchronized void fun1() {
for(int i=0;i<3;i++) {
Resorce.x++;
for(int j=0;j<1000;j++); //延时
System.out.println("t1-sux:"+Resorce.x);
}
}
synchronized static void fun2() {
for(int i=0;i<3;i++) {
Resorce.x++;
for(int j=0;j<1000;j++); //延时
System.out.println("t2-ssx:"+Resorce.x);
}
}
}
运行结果:
t1-ssx:2
t1-ssx:3
t2-sux:2
t1-ssx:4
t2-sux:5
t2-sux:6
ssx:被synchronized修饰,被static修饰,资源为x;
sux:被synchronized修饰,未被static修饰,资源为x。
2.4 两个static方法,都被synchronized修饰,能否并发?(不能并发)
(本例中两个方法访问不同资源,不能并发;若访问同一资源,也不能并发)
class Operate{
synchronized static void fun1() {
for(int i=0;i<3;i++) {
Resorce.x++;
for(int j=0;j<1000;j++); //延时
System.out.println("t1-ssx:"+Resorce.x);
}
}
synchronized static void fun2() {
for(int i=0;i<3;i++) {
Resorce.y++;
for(int j=0;j<1000;j++); //延时
System.out.println("t2-ssy:"+Resorce.y);
}
}
}
运行结果:
t1-ssx:1
t1-ssx:2
t1-ssx:3
t2-ssy:1
t2-ssy:2
t2-ssy:3
ssx:被synchronized修饰,被static修饰,资源为x;
ssy:被synchronized修饰,被static修饰,资源为y。
3 不同对象间
针对第2节中的两种不能并发的情况进行讨论,主类和资源类如下:
class Resorce{ //临界资源
static int x=0;
static int y=0;
}
public class Main {
public static void main(String[] args) {
Operate op1=new Operate();
Operate op2=new Operate();
Thread t1=new Thread() {
public void run() {
op1.fun1();
}
};
Thread t2=new Thread() {
public void run() {
op2.fun2();
}
};
t1.start();
t2.start();
}
}
3.1 两个非static方法,都被synchronized修饰,能否并发?(能并发)
(本例中两个方法访问同一资源,能并发;若访问不同资源,也能并发)
class Operate{
synchronized void fun1() {
for(int i=0;i<3;i++) {
Resorce.x++;
for(int j=0;j<1000;j++); //延时
System.out.println("t1-sux:"+Resorce.x);
}
}
synchronized void fun2() {
for(int i=0;i<3;i++) {
Resorce.x++;
for(int j=0;j<1000;j++); //延时
System.out.println("t2-sux:"+Resorce.x);
}
}
}
运行结果:
t2-sux:2
t1-sux:2
t1-sux:4
t1-sux:5
t2-sux:3
t2-sux:6
sux:被synchronized修饰,未被static修饰,资源为x。
3.2 两个static方法,都被synchronized修饰,能否并发?(不能并发)
(本例中两个方法访问不同资源,不能并发;若访问同一资源,也不能并发)
class Operate{
synchronized static void fun1() {
for(int i=0;i<3;i++) {
Resorce.x++;
for(int j=0;j<1000;j++); //延时
System.out.println("t1-ssx:"+Resorce.x);
}
}
synchronized static void fun2() {
for(int i=0;i<3;i++) {
Resorce.y++;
for(int j=0;j<1000;j++); //延时
System.out.println("t2-ssy:"+Resorce.y);
}
}
}
运行结果:
t1-ssx:1
t1-ssx:2
t1-ssx:3
t2-ssy:1
t2-ssy:2
t2-ssy:3
ssx:被synchronized修饰,被static修饰,资源为x;
ssy:被synchronized修饰,被static修饰,资源为y。
4 注意事项
这里的资源不是临界资源,临界资源由信号量来控制其访问。
声明:本文转自使用synchronized对并发性的影响
使用synchronized对并发性的影响的更多相关文章
- 错误:违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条
在access的mdb数据库动态更新的过程中,遇到了DeleteCommand出现DBConcurrencyException异常,错误:违反并发性: DeleteCommand 影响了预期 1 条记 ...
- 违反并发性: UpdateCommand影响了预期 1 条记录中的 0 条 解决办法
本文转载:http://www.cnblogs.com/litianfei/archive/2007/08/16/858866.html UpdateCommand和DeleteCommand出现DB ...
- 违反并发性: UpdateCommand影响了预期 1 条记录中的 0
今天遇到这个错误,看到下面这种说法都没解决问题: 1 检查是否设有主键.2 DeleteCommand的问题:检查是否含有自动编号字段(Access的自动编号字段可能会引发此异常): UpdateC ...
- updatetable 违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条造成问题一种原因
数据库 表A ID UserName DeptID DeptName 1 张三 1 技术部 表B ID DeptName 1 市场部 当使 ...
- Select for update/lock in share mode 对事务并发性影响
select for update/lock in share mode 对事务并发性影响 事务并发性理解 事务并发性,粗略的理解就是单位时间内能够执行的事务数量,常见的单位是 TPS( transa ...
- Mysql加锁过程详解(4)-select for update/lock in share mode 对事务并发性影响
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- (转载)Select for update/lock in share mode 对事务并发性影响
select for update/lock in share mode 对事务并发性影响 事务并发性理解 事务并发性,粗略的理解就是单位时间内能够执行的事务数量,常见的单位是 TPS( transa ...
- Flume-NG中Transaction并发性探究
我们曾经在Flume-NG中的Channel与Transaction关系(原创)这篇文章中说了channel和Transaction的关系,但是在source和sink中都会使用Transaction ...
- 深入了解 Scala 并发性
2003 年,Herb Sutter 在他的文章 “The Free Lunch Is Over” 中揭露了行业中最不可告人的一个小秘密,他明确论证了处理器在速度上的发展已经走到了尽头,并且将由全新的 ...
- java 并发性和多线程 -- 读感 (一 线程的基本概念部分)
1.目录略览 线程的基本概念:介绍线程的优点,代价,并发编程的模型.如何创建运行java 线程. 线程间通讯的机制:竞态条件与临界区,线程安全和共享资源与不可变性.java内存模型 ...
随机推荐
- 【TouchGFX】Callback
回调函数模板定义 单参数回调函数模板 实现回调函数接口: 实现合法性检查接口: 实现执行接口: 按键触发回调实现 定义回调数据结构对象 使用回调数据结构构造函数 执行接口实现 整个切换机制的管理主体对 ...
- 幻兽帕鲁 Palworld 私有服务器一键部署教程
<幻兽帕鲁>(日语:パルワールド,英语:Palworld) 是由日本开发商 Pocket Pair 推出的一款动作冒险生存游戏.游戏设定在一个由类似动物的生物 "帕鲁" ...
- [转帖]MYSQL--表分区、查看分区
https://www.cnblogs.com/pejsidney/p/10074980.html 一. mysql分区简介 数据库分区 数据库分区是一种物理数据库设计技术.虽然分区技术可 ...
- [转帖]zookeeper三节点集群搭建
https://www.jianshu.com/p/1dcfbf45383b 下载zookeeper Apache源 http://archive.apache.org/dist/zookeeper/ ...
- [转帖]haproxy
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保 ...
- 【转帖】mysql一个索引块有多少指针_深刻理解MySQL系列之索引
索引 查找一条数据的过程 先看下InnoDB的逻辑存储结构:node 表空间:能够看作是InnoDB存储引擎逻辑结构的最高层,全部的数据都存放在表空间中.默认有个共享表空间ibdata1.若是启用in ...
- [转帖]016 Linux 卧槽,看懂进程信息也不难嘛?top、ps
016 Linux 卧槽,看懂进程信息也不难嘛?top.pshttps://my.oschina.net/u/3113381/blog/5455267 1 扒开看看 top 命令参数详情 Linux ...
- [转载]关于NSA的EternalBlue(永恒之蓝) ms17-010漏洞利用
2017年5月19日 感谢原作者:http://www.cnblogs.com/cnbluerain/ 好久没有用这个日志了,最近WannaCry横行,媒体铺天盖地的报道,我这 ...
- 基于华为fusionstorage的块存储CSI
承接上文,块存储的CSI要比对象存储复杂一些,但总的处理逻辑还是一致的.下面以华为fusionstorage的CSI为例进行介绍,该插件支持了多个后端存储,如fusionstorage和oceanst ...
- MyBatis 源码系列:MyBatis 体系结构、六大解析器
体系结构 MyBatis是一个持久层框架,其体系结构分为三层:基础支持层.核心处理层和接口层. 基础支持层包括数据源模块.事务管理模块.缓存模块.Binding模块.反射模块.类型转换模块.日志模块. ...