使用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内存模型 ...
随机推荐
- springboot封装统一返回
springboot返回统一的标准格式 定义注解 package com.yaoling.annotation; import java.lang.annotation.*; @Target({Ele ...
- canal报错nosuchmethod ..bytebuffer
解决方法:更新jdk版本与es一致
- [转帖]TLS 加速技术:Intel QuickAssist Technology(QAT)解决方案
https://zhuanlan.zhihu.com/p/631184323 3 人赞同了该文章 作者:vivo 互联网服务器团队- Ye Feng 本文介绍了 Intel QAT 技术方案,通过 ...
- [转帖]使用 mydumper/loader 全量导入数据
数据迁移 mydumper 是一个更强大的数据迁移工具,具体可以参考 https://github.com/maxbube/mydumper. 我们使用 mydumper 从 MySQL 导出数据,然 ...
- [转帖]《Linux性能优化实战》笔记(十五)—— 磁盘IO的工作原理
前一篇介绍了文件系统的工作原理,这一篇来看看磁盘IO的工作原理 一. 磁盘 1. 按存储介质分类 磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘. 机械磁盘, ...
- [转帖]阿里发布自研ARM服务器芯片倚天710,不对外出售
https://www.modb.pro/db/139440 10月19日,阿里巴巴旗下半导体公司平头哥发布自研云芯片倚天710,并宣称该芯片是业界性能最强的ARM服务器芯片,性能超过业界标杆20%, ...
- node中的fs模块和http模块的学习
读取文件 fs 模块 第1个参数就是要读取的文件路径 第2个参数是一个回调函数(error,data)=>{} error 如果读取失败,error 就是错误对象 如果读取成功,error 就是 ...
- 【JS 逆向百例】复杂的登录过程,最新WB逆向
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 本次的逆向目标是 ...
- 渗透学习笔记(cookies、XSS注入)
1.cookie 插件:cookie-editor JavaScript语法: 获取:document.cookie; 设置:document.cookie="username=felix& ...
- Unity中的string gc优化
在项目中如果有大量的字符串拼接,比如每秒执行的倒计时,协议中的日志输出,每次拼接会产生大量的gc,尤其是在ILRuntime下执行 gc alloc的次数会更加频繁. zstring 有两个字符串处理 ...