深入理解synchronized方法同步的是方法还是对象?
一.运用synchronized关键字
首先我们来看看一个多线程中线程不安全的列子
代码如下:
共享数据类:
public class NotSynchronizated extends Thread {
private int num =10;
@Override
public void run(){
try {
System.out.println("当前线程为:"+currentThread().getName());
num--;
System.out.println("num的值为:"+num);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
线程测试类:
public class Text { public static void main(String[] args) {
//将共享数据放入3个线程里进行处理
NotSynchronizated notSynchronizated = new NotSynchronizated();
Thread t1=new Thread(notSynchronizated,"A");
Thread t2=new Thread(notSynchronizated,"B");
Thread t3=new Thread(notSynchronizated,"C");
Thread t4=new Thread(notSynchronizated,"D");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
在这个列子中run方法没有使用关键字synchronized,那么就会造成线程不安全,结果如下:
那么当我们使用关键字synchronized后结果就会同步了,结果如下:
那么,在这里是对这个run方法进行了同步呢?还是对这个对象进行了同步呢?
二.synchronized同步的是对象
为了证明synchronized同步的是对象,我们举出下面的代码:
共享资源类:
public class SynchronizatedObject extends Thread {
private int num=20;
@Override
public synchronized void run(){ System.out.println("当前的线程为"+currentThread().getName());
num--;
System.out.println("当前num为"+num);
} }
测试类:
public class Text { public static void main(String[] args) {
SynchronizatedObject synchronizatedObject1=new SynchronizatedObject();//创建第一个资源共享类
SynchronizatedObject synchronizatedObject2=new SynchronizatedObject();//创建第二个资源共享类
Thread t1=new Thread(synchronizatedObject1,"A");//加入
Thread t2=new Thread(synchronizatedObject2,"B");//加入
t1.start();
t2.start();
}
}
结果如下:
从这里明显看出这个synchronized关键字同步的是对象而不是方法,
如果同步的是方法那么他将不会出现这种线程不安全的情况,而是两对象一个一个按顺序的进入这个同步的方法里,
出现这中情况,只能说明他是对象同步的。
所以说这段代码意思是我创建了两个对象,同时我也创建了两把对象锁来同步话各自的run方法,只不过每一条线程的调用顺序不同才会出现这样的结果。
总结:synchronized关键字同步的是对象不是方法
深入理解synchronized方法同步的是方法还是对象?的更多相关文章
- java 多线程: Thread 并发访问-代码块同步synchronized {};String作为被锁的对象
方法同步的弊端 方法同步的时候,如果一个方法需要线程安全控制的代码速度其实很快,但是还有其他的业务逻辑代码耗时非常长(比如网络请求),这样所有的线程就在这一块就等待着了,这样造成了极大的资源浪费如果并 ...
- 【Java面试题】26 多线程有几种实现方法?同步有几种实现方法? 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
问题一:多线程有几种实现方法?同步有几种实现方法? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与not ...
- java 多线程:Thread 并发线程: 方法同步synchronized关键字,与static的结合
1.方法内的变量是安全的 方法内定义的变量,每个变量对应单独的内存变量地址,多个线程之间相互不影响.多个线程之间的变量根本没有一毛钱关系 public class ThreadFuncVarSafe ...
- 牛客网Java刷题知识点之多线程同步的实现方法有哪些
不多说,直接上干货! 为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避 ...
- synchronized(6)修饰语方法之:static方法
当一个synchronized关键字修饰的方法同时又被static修饰,之前说过,非静态的同步方法会将对象上锁,但是静态方法不属于对象,而是属于类,它会将这个方法所在的类的Class对象上锁. 一个类 ...
- 理解JAVA - 面向对象(object) - 属性,方法
理解JAVA - 面向对象(object) - 属性,方法 多态的体现: 向上造型,父类接收子类对象:向上造型: 从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...
- 深入理解javascript中实现面向对象编程方法
介绍Javascript中面向对象编程思想之前,需要对以下几个概念有了解: 1. 浅拷贝和深拷贝:程序在运行过程中使用的变量有在栈上的变量和在堆上的变量,在对象或者变量的赋值操作过程中,大多数情况先是 ...
- C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法。
原文:C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法. 一般我们在撰写Windows Phone ...
- synchronized修饰static方法与非static方法的区别
1. 当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例),作用范围是整个静态方法,作用的对象是这个类的所有对象. 2. 当synchron ...
随机推荐
- Python sqlalchemy orm 常用操作
增add # 创建表1 # 注:高级封装 import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engine # 调用基类Base fro ...
- POJ 1038 Bugs Integrated, Inc.(DFS + 三进制状压 + 滚动数组 思维)题解
题意:n*m方格,有些格子有黑点,问你最多裁处几张2 * 3(3 * 2)的无黑点格子. 思路:我们放置2 * 3格子时可以把状态压缩到三进制: 关于状压:POJ-1038 Bugs Integrat ...
- HDU2476 String painter——区间DP
题意:要把a串变成b串,每操作一次,可以使a串的[l,r]区间变为相同的一个字符.问把a变成b最少操作几次. 这题写法明显是区间dp ,关键是处理的方法. dp[l][r]表示b串的l~r区段至少需要 ...
- jsp/servlet学习三之会话管理初解
由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件 ...
- Linux md5sum 的用法
MD5 算法常常被用来验证网络文件传输的完整性,防止文件被篡改.MD5 全称是报文摘要算法,此算法对任意长度 的信息逐位计算,产生一个二进制长度为 128 位(十六进制长度 32 位)的报文摘要,不同 ...
- ugui 灰度shader mask冲突解决 转。。。
项目上遇到了一个问题,灰度shader无法在mask下使用,两个之间会一定的冲突.经查验是mask组件对shader的相关属性有要求,添加相关的属性则可符合要求使其他shader使用UGui里的mas ...
- js 数组元素排序
字母排序 <html> <body> <script type="text/javascript"> ) arr[] = "Georg ...
- C/C++.判断文件是否存在(_access)
1. int _access(char* path,int mode)头文件<io.h>功能:确定文件或文件夹的访问权限.如果指定的存取方式有效,则函数返回0,否则函数返回-1. 参数pa ...
- 如何在nginx容器中使用ping、nslookup、ip、curl 等工具?
Nginx镜像太精简了,启动一个容器进行测试时,常用的网络工具都没有,可以使用下面的命令进行安装.也可以直接起一个busybox容器进行测试. apt update #ping apt install ...
- pip freeze 命令迁移模块
问题描述:现有一个测试环境安装了脚本相关的各类模块,现需要不通过联网下载,在另一个环境配置安装相同的模块 解决方案: 在安装了python脚本相关的各类模块的测试环境里,进入到任意目录下,导出pyth ...