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对并发性的影响的更多相关文章

  1. 错误:违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条

    在access的mdb数据库动态更新的过程中,遇到了DeleteCommand出现DBConcurrencyException异常,错误:违反并发性: DeleteCommand 影响了预期 1 条记 ...

  2. 违反并发性: UpdateCommand影响了预期 1 条记录中的 0 条 解决办法

    本文转载:http://www.cnblogs.com/litianfei/archive/2007/08/16/858866.html UpdateCommand和DeleteCommand出现DB ...

  3. 违反并发性: UpdateCommand影响了预期 1 条记录中的 0

    今天遇到这个错误,看到下面这种说法都没解决问题: 1 检查是否设有主键.2 DeleteCommand的问题:检查是否含有自动编号字段(Access的自动编号字段可能会引发此异常):  UpdateC ...

  4. updatetable 违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条造成问题一种原因

    数据库 表A ID  UserName DeptID DeptName 1      张三          1          技术部 表B ID   DeptName 1      市场部 当使 ...

  5. Select for update/lock in share mode 对事务并发性影响

    select for update/lock in share mode 对事务并发性影响 事务并发性理解 事务并发性,粗略的理解就是单位时间内能够执行的事务数量,常见的单位是 TPS( transa ...

  6. Mysql加锁过程详解(4)-select for update/lock in share mode 对事务并发性影响

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  7. (转载)Select for update/lock in share mode 对事务并发性影响

    select for update/lock in share mode 对事务并发性影响 事务并发性理解 事务并发性,粗略的理解就是单位时间内能够执行的事务数量,常见的单位是 TPS( transa ...

  8. Flume-NG中Transaction并发性探究

    我们曾经在Flume-NG中的Channel与Transaction关系(原创)这篇文章中说了channel和Transaction的关系,但是在source和sink中都会使用Transaction ...

  9. 深入了解 Scala 并发性

    2003 年,Herb Sutter 在他的文章 “The Free Lunch Is Over” 中揭露了行业中最不可告人的一个小秘密,他明确论证了处理器在速度上的发展已经走到了尽头,并且将由全新的 ...

  10. java 并发性和多线程 -- 读感 (一 线程的基本概念部分)

    1.目录略览      线程的基本概念:介绍线程的优点,代价,并发编程的模型.如何创建运行java 线程.      线程间通讯的机制:竞态条件与临界区,线程安全和共享资源与不可变性.java内存模型 ...

随机推荐

  1. 凡是有但是-varchar和nvarchar的初步学习之一

    凡是有但是-varchar和nvarchar的初步学习之一 背景 高应用开发, 在涉及到国内国外的问题时,重要的事情有两个: 时区转换, 字符集转换. 时区转换虽然是很难理清楚, 各种规范不统一的事情 ...

  2. [转帖]Oracle与防火墙

    https://www.laoxiong.net/oracle_and_firewall.html 老熊 Oracle数据库管理 2009-04-20 最近有两次Oracle数据库故障与防火墙有关.这 ...

  3. [转帖][译]tcpdump 示例教程

    https://colobu.com/2019/07/16/a-tcpdump-tutorial-with-examples/ 目录 [−] 基于IP查找流量 根据来源和目标进行筛选 根据网段进行查找 ...

  4. [转帖] 容器内的Linux诊断工具0x.tools

    https://www.cnblogs.com/codelogs/p/16242999.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# Linux上有 ...

  5. Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑

    Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑 摘要 本周研发同事反馈现场有一个问题. 客户使用mysql的数据库(Windows平台) 然后在多表union all 创建 ...

  6. [转帖]高并发系统中的尾延迟Tail Latency

    开发和运维高并发系统的工程师可能都有过类似经验,明明系统已经调优完毕,该异步的异步,该减少互斥的地方引入无锁,该减少IO的地方更换引擎或者硬件,该调节内核的调节相应参数,然而,如果在系统中引入实时监控 ...

  7. awk的简单样例

    shell awk求和 当第一列相同时,对应的第二列相加 awk'{sum[$1]+=$2}END{for(c in sum){print c,sum[c]}}'输入文件名 在Shell中,我们可以用 ...

  8. 隐私集合求交(PSI)协议研究综述

    摘要 隐私集合求交(PSI)是安全多方计算(MPC)中的一种密码学技术,它允许参与计算的双方,在不获取对方额外信息(除交集外的其它信息)的基础上,计算出双方数据的交集.隐私集合求交在数据共享,广告转化 ...

  9. JS ----- JS原型与原型链终极详解(一)

    一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function 是 JS 自带的函数对象.下面举例说明 var o1 = ...

  10. [LeetCode刷题记录]113 路径总和 II

    题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 难度 中等 题解 采用深度搜索优先,遍历每条从根节点到叶子节点的 ...