史上最全的synchronized解释
首先:推荐使用synchronized(obj)这种方法体的使用方式,一个类里面建议尽量使用单一的同步方法,多种方法混用,维护成本太大。
其次:关于java5.0新增的ReenTrantLock方法:《Javaconcurrency in practice》里说的很清楚:只有当内置锁不能满足的情况下采考虑使用LOCK,如果忘记UNLOCK将是一颗定时炸弹。符合 “可定时的,可轮询的,可中断的”情况下建议使用LOCK。
最后:鉴于本人10年左右的编程经验,建议使用synchronized,同时建议使用同步成员变量的形式,可以作为项目规范实施。
概念总结:
synchronized锁的是对象(除非.Class)
如果是多个对象根本不存在竞争,则无需synchronized。如果存在synchronized的方法和普通方法并存,则根本没有等待,无需考虑锁,但是要考虑共享资源的问题,这是并发的问题,和锁已经没有关系了,测试例子说明了这个问题。
synchronized(.Class)
唯一存在可能控制多个对象竞争等待的问题,不建议使用。
同步方法
synchronized A()
synchronized A()
##如果不同线程监视同一个实例对象,就会等待
synchronized A()
synchronized B()
##如果不同线程监视同一个实例对象,就会等待
synchronized A()
B()
##线程各自获取monitor,不会有等待.
同步this
synchronized(this)
synchronized A()
##如果不同线程监视同一个实例对象,就会等待
synchronized(this)
synchronized(this)
##如果不同线程监视同一个实例对象,就会等待
synchronized(this)
B()
##线程各自获取monitor,不会有等待.
同步成员变量
synchronized(obj1)
synchronized(obj1)
##如果不同线程监视同一个实例对象,就会等待
synchronized(obj2)
synchronized(obj1)
##线程各自获取monitor,不会有等待.
synchronized(obj1)
synchronized A()
##线程各自获取monitor,不会有等待.
synchronized(obj1)
synchronized(this)
synchronized(class)
B()
##线程各自获取monitor,不会有等待.
同步Class
synchronized(class)
synchronized(this)
##线程各自获取monitor,不会有等待.
synchronized(class)
synchronized(obj1)
##线程各自获取monitor,不会有等待.
synchronized(class)
synchronized A ()
##线程各自获取monitor,不会有等待.
synchronized(class)
synchronized(class)
##如果不同线程监视同一个实例或者不同的实例对象,都会等待.
以上所有结论,本人测试有效。
public class Test {
public static void main(String[] args) {
final TestData TestData = new TestData();
new Thread() {
public void run() {
testData.insert(Thread.currentThread());
};
}.start();
new Thread() {
public void run() {
testData.insert1(Thread.currentThread());
};
}.start();
}
}
class TestData {
private ArrayList<Integer> arrayList = new ArrayList<Integer>();
public synchronized void insert(Thread thread){
for(int i=0;i<5;i++){
System.out.println(thread.getName()+"在插入数据"+i);
arrayList.add(i);
}
}
public void insert1(Thread thread){
for(int i=0;i<5;i++){
System.out.println(thread.getName()+"在插入数据"+i);
arrayList.add(i);
}
} public void insert2(Thread thread){
for(int i=0;i<5;i++){
System.out.println(thread.getName()+"在插入数据"+i);
arrayList.add(i);
}
}
}
史上最全的synchronized解释的更多相关文章
- 史上最全阿里 Java 面试题总结
以下为大家整理了阿里巴巴史上最全的 Java 面试题,涉及大量 Java 面试知识点和相关试题. JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节. String类能被继承吗,为什么 ...
- Redis分布式锁 (图解-秒懂-史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- spring + spring mvc + tomcat 面试题(史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- 史上最全的maven pom.xml文件教程详解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- GitHub上史上最全的Android开源项目分类汇总 (转)
GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...
- 史上最全的 Java 新手问题汇总
史上最全的 Java 新手问题汇总 Java是目前最流行的编程语言之一——它可以用来编写Windows程序或者是Web应用,移动应用,网络程序,消费电子产品,机顶盒设备,它无处不在. 有超过30亿 ...
- 了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...
- 史上最全的maven的pom.xml文件详解(转载)
此文出处:史上最全的maven的pom.xml文件详解——阿豪聊干货 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...
- 你想找的Python资料这里全都有!没有你找不到!史上最全资料合集
你想找的Python资料这里全都有!没有你找不到!史上最全资料合集 2017年11月15日 13:48:53 技术小百科 阅读数:1931 GitHub 上有一个 Awesome - XXX 系列 ...
随机推荐
- Linux的iptables常用配置范例(2)
iptables -F #清除所有规则 iptables -X #清除所有自定义规则 iptables -Z #各项计数归零 iptables -P INPUT DROP #将input链 ...
- 深度学习 for java http://deeplearning4j.org/
http://deeplearning4j.org/ http://deeplearning4j.org/zh-neuralnet-overview
- lvs(+keepalived)、haproxy(+heartbeat)、nginx 负载均衡的比较分析
目前使用比较多的就是标题中提到的这两者,其实lvs和haproxy都是实现的负载均衡的作用,keepalived和heartbeat都是提高高可用性的,避免单点故障.那么他们为什么这么搭配,而又有什么 ...
- (中等) POJ 1054 The Troublesome Frog,记忆化搜索。
Description In Korea, the naughtiness of the cheonggaeguri, a small frog, is legendary. This is a we ...
- Spring--Bean scope
singleton, prototype,request, session, global session bean.xml: <?xml version="1.0" enc ...
- getElementsByTagName("div")和$("div")区别
作者:zccst <body> <div class="selected">1</div> <div class="select ...
- WebView点击图片看大图效果
在webViewDelegate里面添加如下代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 - (voi ...
- linux获得目录下文件个数
获得当前目录下文件个数赋值给变量panonum: panonum=$(ls -l |grep "^-" | wc -l) 获取指定目录下文件个数赋值给指定变量: panonum=$ ...
- 再次写了第一个servlet
费时2小时,熟悉tomcat和编写了第一个servlet
- MongoDB的$type操作符
字段类型定义: db.col.find({"title" : {$type : 2}})