Java Synchronized 遇上 静态/实例方法 、静态/实例变量
同步
1)同步方法
2)同步块
21) 实例变量
22) 类变量
锁定的内容
1)锁定类的某个特定实例
2)锁定类对象(类的所有实例)
一。同步类实例:同步方法
public class Demo { public synchronized void m1(){
//...............
} public void m2(){
//............ synchronized(this){
//.........
} //........
}
}
这两种写法的效果是一样的,锁定的都是类实例对象。
如果有一个实例对象demo,有两个线程: thread1,thread2,都调用了demo 对象,如果 thread1调用了demo.m1(),
则thread2在该时间内不能访问demo.m1() 和 demo.m2(); 因为thread1把demo这个对象的锁使用了,所以无法分给其它线程使用。但是,如果thread1
调用 demo1.m1(), thread2调用 demo2.m1(), 则可以同时进行,因为它们调用的是不同的Demo类对象实例。
二。同步类实例:同步块(比同步方法更灵活)
public class Demo {
Object a = new Object();
Object b = new Object(); public void m1(){
//............ synchronized(a){
//.........
} //........
} public void m2(){
//............ synchronized(b){
//.........
} //........
}
}
这种情况下,是实现代码块锁定,锁定的对象是 变量 a 或 b; 如果有一个实例对象 demo,另外有两个线程: thread1,thread2,
都调用了demo 对象,那么,在同一时间,如果 thread1调用了demo.m1(),则thread2在该时间内可以访问demo.m2();但不能访问
demo.m1() 的同步块, 因为a被 thread1锁定了。
三。锁定静态变量或静态方法
public class Demo{
static Object o = new Object(); public static synchronized void m1() {
//....
} public static void m2() {
//...
synchronized (Demo.class) {
//.....
}
//.....
} public static void m3() {
//..........
try {
synchronized (Class.forName("Demo")) {
//............
}
} catch (ClassNotFoundException ex) {
}
//.............
} public static void m4() {
//............
synchronized(o){
//........
}
//..........
}
}
以上4个方法中实现的效果都是一样的,其锁定的对象都是类Demo,而不是实例对象 ,即在多线程中,其共享的资源是属于类的,而不是属于类实例的。
在这种情况下,如果thread1 访问了这4个方法中的任何一个, 在同一时间内其它的线程都不能访问 这4个方法。
Java Synchronized 遇上 静态/实例方法 、静态/实例变量的更多相关文章
- 当Java代码遇上抽象、重载加重写,一切都不美好了
当Java代码遇上抽象.重载加重写.一切都不美好了 前几天调程序遇上个奇怪的bug.一直没找到问题,今天最终发现问题所在了,不说了先上代码(下面代码是演示样例代码,经測试,Java不存在这问题,安卓存 ...
- Java中实例方法,实例变量,静态方法,静态变量,final方法重写的问题,覆盖
Java中只有非私有的实例方法能被重写,即实现多态,子类可以覆盖父类的方法,但是实例变量不能覆盖,若子类和父类均定义了同样名称的变量,则对于子类来说这是两个不同的变量,要想调用父类的变量必须显示去调用 ...
- java静态类、静态方法、静态代码块,静态变量及实例方法,实例变量初始化顺序及内存管理,机制
1.当一个类被第一次使用时,它需要被类加载器加载,而加载过程涉及以下两点: (1)在加载一个类时,如果它的父类还未被加载,那么其父类必须先被加载: (2)当类加载到内存之后,按照在代码中的出现顺序执行 ...
- 区别JS中类的静态方法,静态变量,实例方法,实例变量
1.类的静态方法 先来段代码之后分析 // JS类静态函数 function BaseClass() { } // 类添加add函数 BaseClass.add = function() { cons ...
- JAVA类与对象(六)------实例变量与类变量的区别,实例方法和类方法的区别
实例变量 实例变量声明在一个类中,但在方法.构造方法和语句块之外: 当一个对象被实例化之后,每个实例变量的值就跟着确定: 实例变量在对象创建的时候创建,在对象被销毁的时候销毁: 实例变量的值应该至少被 ...
- 编写Java程序,实现多线程操作同一个实例变量的操作会引发多线程并发的安全问题。
查看本章节 查看作业目录 需求说明: 多线程操作同一个实例变量的操作会引发多线程并发的安全问题.现有 3 个线程代表 3 只猴子,对类中的一个整型变量 count(代表花的总数,共 20 朵花)进行操 ...
- Java 爬虫遇上数据异步加载,试试这两种办法!
这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...
- 在自学java路上遇上的南墙
从2016年12月20号自学java,先是咨询了下培训中心,得小两万,四个月毕业,算了一笔账,一百二十天,合下来每天三百多块,再加上开销之类压力太大,于是开始入坑自学,随后血一般的教训直面而来: 1. ...
- FasfDFS整合Java实现文件上传下载功能实例详解
https://www.jb51.net/article/120675.htm 在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java ...
随机推荐
- 如何设置UITextView不可被编辑
在项目中遇到一些需求需要把文字用UITextView来展示,但是该文字不能被编辑,只要把以下该代理方法实现就可以了 -(BOOL)textViewShouldBeginEditing:(UITextV ...
- poj3422 拆点法x->x'建立两条边+最小费用最大流
/** 题目:poj3422 拆点法+最小费用最大流 链接:http://poj.org/problem?id=3422 题意:给定n*n的矩阵,含有元素值,初始sum=0.每次从最左上角开始出发,每 ...
- jQuery中jsonp的跨域处理,no access-control-allow-origin,unexpected token
引言 ajax跨域就无法成功获取数据了,需要通过jsonp来处理 报错如下 1.改为jsonp var targeturl = ajaxurl+"?g=Api&m="+m+ ...
- spring boot +mybatis分页查询
这是spring boot集合mybatis的分页查询. pom依赖: <!-- 分页插件 --> <dependency> <groupId>com.github ...
- vhost in nodejs
关于vhost 个人理解为vhost是一种可以在一个ip下同时部署多个不同域名站点的的概念. 其好处就是对一些小型的网站不必每个网站都占用一个ip,或者说一个服务,举个例子,vhost的概念就相当于打 ...
- 【Java】之static静态方法与非static静态方法区别
1.A.class:没有static public class A { public String getText(){ } B.class调用A的方法时 public class B { publi ...
- 打开.py文件的方法
用IDLE打开这个文件,然后按F5,系统就自动开始运行这个python程序,然后当前运行目录就跳转到这个目录了
- 酷狗缓存文件kgtemp的加密方式
[转自:http://www.cnblogs.com/KMBlog/p/6877752.html] 首先对比了一下缓存文件和下载好的mp3文件,发现缓存文件多了1024个字节,而且对比了几个缓存文件, ...
- .NET中二进制图片的存储与读取
判断HttpContext是否为空: string configPath = "img/defaultPhoto.png"; if (HttpContext.Current != ...
- JQuery基本选择器和基本动画方法总结
刚开始接触JQuery是在大三的时候,那时候先学的Javascript,然后跳跃到JQuery,就一个字,爽.但因为之前用的不是太多,所以很多都忘了,直接导致的后果就是之前在一家公司面试,面试官问我要 ...