- 浏览: 898270 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
通过分析这两个用法的分析,我们可以理解java中锁的概念。一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全局锁(该锁针对的是类,无论实例多少个对象,那么线程都共享该锁)。实例锁对应的就是synchronized关键字,而类锁(全局锁)对应的就是static synchronized(或者是锁在该类的class或者classloader对象上)。下面的文章做了很好的总结:
1.synchronized与static synchronized 的区别
synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了。那么static synchronized恰好就是要控制类的所有实例的访问了,static synchronized是限制线程同时访问jvm中该类的所有实例同时访问对应的代码快。实际上,在类中某方法或某代码块中有 synchronized,那么在生成一个该类实例后,改类也就有一个监视快,放置线程并发访问改实例synchronized保护快,而static synchronized则是所有该类的实例公用一个监视快了,也也就是两个的区别了,也就是synchronized相当于 this.synchronized,而static synchronized相当于Something.synchronized.
一个日本作者-结成浩的《java多线程设计模式》有这样的一个列子:
- pulbic class Something(){
- public synchronized void isSyncA(){}
- public synchronized void isSyncB(){}
- public static synchronized void cSyncA(){}
- public static synchronized void cSyncB(){}
- }
那么,加入有Something类的两个实例a与b,那么下列组方法何以被1个以上线程同时访问呢
- a. x.isSyncA()与x.isSyncB()
- b. x.isSyncA()与y.isSyncA()
- c. x.cSyncA()与y.cSyncB()
- d. x.isSyncA()与Something.cSyncA()
这里,很清楚的可以判断:
a,都是对同一个实例的synchronized域访问,因此不能被同时访问
b,是针对不同实例的,因此可以同时被访问
c,因为是static synchronized,所以不同实例之间仍然会被限制,相当于Something.isSyncA()与 Something.isSyncB()了,因此不能被同时访问。
那么,第d呢?,书上的 答案是可以被同时访问的,答案理由是synchronzied的是实例方法与synchronzied的类方法由于锁定(lock)不同的原因。
个人分析也就是synchronized 与static synchronized 相当于两帮派,各自管各自,相互之间就无约束了,可以被同时访问。目前还不是分清楚java内部设计synchronzied是怎么样实现的。
结论:A: synchronized static是某个类的范围,synchronized static cSync{}防止多个线程同时访问这个 类中的synchronized static 方法。它可以对类的所有对象实例起作用。
B: synchronized 是某实例的范围,synchronized isSync(){}防止多个线程同时访问这个实例中的synchronized 方法。
2.synchronized方法与synchronized代码快的区别
synchronized methods(){} 与synchronized(this){}之间没有什么区别,只是synchronized methods(){} 便于阅读理解,而synchronized(this){}可以更精确的控制冲突限制访问区域,有时候表现更高效率。
3.synchronized关键字是不能继承的
这个在http://www.learndiary.com/archives/diaries/2910.htm一文中看到的,我想这一点也是很值得注意的,继承时子类的覆盖方法必须显示定义成synchronized。(但是如果使用继承开发环境的话,会默认加上synchronized关键字)
两种方式效率比较:
1、同步块,代码如下:
- <span style="font-size:18px;">package com.bjtest.belen;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class TestSynchronized {
- /**
- * @param args
- */
- public static void main(String[] args) {
- ExecutorService service = Executors.newCachedThreadPool();
- final CountDownLatch cdOrder = new CountDownLatch(1);
- final CountDownLatch cdAnswer = new CountDownLatch(3);
- final SynchonizedClass sc = new SynchonizedClass();
- for(int i=0; i<3; i++){
- Runnable runnable = new Runnable(){
- public void run() {
- try{
- cdOrder.await();
- sc.start();
- cdAnswer.countDown();
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- };
- service.execute(runnable);
- }
- try{
- Thread.sleep((long) (Math.random()*10000));
- System.out.println("线程" + Thread.currentThread().getName() +
- "发布执行命令");
- cdOrder.countDown();
- long beginTime = System.currentTimeMillis();
- System.out.println("线程" + Thread.currentThread().getName() +
- "已经发送命令,正在等待结果");
- cdAnswer.await();
- System.out.println("线程" + Thread.currentThread().getName() +
- "已收到所有响应结果,所用时间为:" + (System.currentTimeMillis()-beginTime));
- }catch(Exception e){
- e.printStackTrace();
- }
- service.shutdown();
- }
- }
- class SynchonizedClass{
- public void start() throws InterruptedException{
- Thread.sleep(100);//执行其它逻辑消耗时间
- synchronized(this){
- System.out.println("我运行使用了 10 ms");
- }
- }
- }
- </span>
运行结果如下:
线程main发布执行命令
线程main已经发送命令,正在等待结果
我运行使用了 10 ms
我运行使用了 10 ms
我运行使用了 10 ms
线程main已收到所有响应结果,所用时间为:110
同步方法,代码如下:
- <span style="font-size:18px;">package com.bjtest.belen;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class TestSynchronized {
- /**
- * @param args
- */
- public static void main(String[] args) {
- ExecutorService service = Executors.newCachedThreadPool();
- final CountDownLatch cdOrder = new CountDownLatch(1);
- final CountDownLatch cdAnswer = new CountDownLatch(3);
- final SynchonizedClass sc = new SynchonizedClass();
- for(int i=0; i<3; i++){
- Runnable runnable = new Runnable(){
- public void run() {
- try{
- cdOrder.await();
- sc.start();
- cdAnswer.countDown();
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- };
- service.execute(runnable);
- }
- try{
- Thread.sleep((long) (Math.random()*10000));
- System.out.println("线程" + Thread.currentThread().getName() +
- "发布执行命令");
- cdOrder.countDown();
- long beginTime = System.currentTimeMillis();
- System.out.println("线程" + Thread.currentThread().getName() +
- "已经发送命令,正在等待结果");
- cdAnswer.await();
- System.out.println("线程" + Thread.currentThread().getName() +
- "已收到所有响应结果,所用时间为:" + (System.currentTimeMillis()-beginTime));
- }catch(Exception e){
- e.printStackTrace();
- }
- service.shutdown();
- }
- }
- class SynchonizedClass{
- public synchronized void start() throws InterruptedException{
- Thread.sleep(100);//执行其它逻辑消耗时间
- // synchronized(this){
- System.out.println("我运行使用了 10 ms");
- // }
- }
- }
- </span>
运行结果如下:
线程main发布执行命令
线程main已经发送命令,正在等待结果
我运行使用了 10 ms
我运行使用了 10 ms
我运行使用了 10 ms
线程main已收到所有响应结果,所用时间为:332
两者相差:222ms。
发表评论
-
maven 在Mac OS下运行的问题总结
2014-05-16 17:24 786在maven下生成基本的项目结构。 生成eclipse项 ... -
【zz】 java函数参数类型后添加三点的用法
2012-07-02 09:48 1008今天看到一个没见过的函数参数列表test(int... a), ... -
【zz】Java编码的理解和Java加载器的理解
2012-06-08 15:59 713一,我对java中编码的理解1. 编码的产生 对电脑而言 ... -
类加载器入门级应用
2012-06-08 15:17 8961、类加载器负责加载 Ja ... -
ClassLoader详解
2012-06-08 14:23 1214Point One 将J2EE应用程序移植到W ... -
Java静态代理与动态代理
2012-05-29 10:32 896JAVA的静态代理与动态代 ... -
JDK的动态代理深入解析(Proxy,InvocationHandler)(转)
2012-05-29 10:31 5139调用处理器InvocationHandle ... -
zz 动态反射实现AOP的简单原理
2012-05-28 17:46 864其实AOP的意思就是面向切面编程. OO注重的是我们 ... -
理解Java枚举在单例模式的应用
2012-06-05 15:50 12455.3.9 单例和枚举 按照《高效Java 第二版》中的说 ... -
Java 枚举的介绍
2012-05-23 16:50 0一、使用简单程序完成枚举的功能 例:使用简单类完成枚举操作 ... -
枚举类型的用法
2012-06-05 15:50 1384DK1.5引入了新的类型——枚举。在 Java 中它虽然算 ... -
单例模式的七种写法 (包括1.5新特性)
2012-05-23 16:18 0第一种(懒汉,线程不安全): <!--<br / ... -
重写hashCode方法的意义
2012-05-23 16:01 1600Java中的很多对象都override了equ ... -
JDK Log的设计思想
2012-05-23 14:39 1273最近在看《Agile Java》,看到日志一节,收获颇多,所以 ... -
双精度、单精度的有效位数
2012-05-22 17:25 4997浮点数7位有效数字。(应该是单精度数) 双精度数16位有效 ... -
DecimalFormat 使用方法
2012-05-22 16:44 989我们经常要将数字进行格式化,比如取2位小数,这是最常见的。Ja ... -
Java Applet 无法运行的一个问题
2012-04-28 15:09 2499当你用JDK1.6开发出的新功能,在JDK1.6上re ... -
JDK1.5之中的Map相关的类
2012-04-26 10:14 1815java5的java.util包提供了大量集合类。其中最常用的 ... -
设计模式应用场景总结
2012-04-11 16:47 1231在J2EE的开发和测试中,其实不知不觉已经使用了许多设计模式。 ... -
【转】有状态和无状态的Servlet
2012-04-06 14:57 3705我相信有不少人还不明白有状态和无状态(Stateful and ...
相关推荐
大家在学习java多线程的时候肯定会遇到这个...static synchronized这个是“全局锁”或者是“类锁”,该锁针对的是类,不管实例了多少个对象,线程都共享该锁。 下面我们来看代码: import java.util.concurrent.TimeUni
主要介绍了Java中Synchronized(对象锁)和Static Synchronized(类锁)的区别,希望对大家有所帮助,一起跟随小编过来看看吧
java语言 并发编程 ReentrantLock与synchronized区别 详解
基础理论知识,描述lock和synchronized的区别和基础的理论,其中还有死锁等基础概念。
并发编程中,锁是经常需要用到的,今天我们一起来看下Java中的锁机制:synchronized和lock。 Synchronized 和 Lock的概念 Synchronized 是Java 并发编程中很重要的关键字,另外一个很重要的是 volatile。Syncronized...
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized
讲解了锁的两种特性,互斥和可见;volatile和synchronize的用法和区别
在 Java 5 以前,synchronized 是仅有的同步手段,在代码中, synchronized 可以用来修饰方法,也可以使用在特定的代码块儿上,本质上
java中synchronized用法
你还在用synchronized?线程安全相关知识深入剖析
Synchronized与ThreadLocal
如果 再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。 无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而...
synchronized的几种示例研究,方法加锁,代码块加锁(this和对象)以及静态方法加锁的示例和效果。基本上包含了synchronized的几种常用的方式。
java synchronized的一些小实验,对帮助理解synchronized的使用有一定的帮助。
线程同步Synchronized,监视器monitor和锁lock的关系2---马克-to-win java视频
java里面synchronized用法
Synchronized关键字的用法
synchronized 测试案例,同步一个对象或者多个对象的案例均有,还有成功和失败案例的对比
Synchronized锁在Spring事务管理下,导致线程不安全。