`
trydofor
  • 浏览: 147167 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

synchronized 处发生了什么

阅读更多
问题
1.为何 map.clear(); 时的输出的毫秒数不连续?
2.在 synchronized (map) 处发生了什么?


代码
public class Test {
	static transient long   currentMs;
	static Map map = new HashMap();
	
	public static void main(String[] args) {
		{
			long start = System.currentTimeMillis();
			int  spans = 1000;
			Map m = new HashMap();
			int count=0;
			while(System.currentTimeMillis() - start < spans) {
				Integer i = new Integer(count); 
				m.put(i,i);
		    	count++;
			}
			long total = System.currentTimeMillis()-start;
			System.out.println("|| SimpleAdd || "+(count/total)+" ||");
		}
		{
			long start = System.currentTimeMillis();
			int  spans = 1000;
			int count=0;
			while(System.currentTimeMillis() - start < spans) {
				make(count);
		    	count++;
			}
			long total = System.currentTimeMillis()-start;
			System.out.println("|| MethodAdd || "+(count/total)+" ||");
		}
	}

	public static void make(int c) {
		synchronized (map) {
			final long nowMs = System.currentTimeMillis();
			if(nowMs >currentMs){
				System.out.println("map.clear()="+nowMs+", map.size()="+map.size());
				map.clear();
				currentMs=nowMs;
			}
			Integer i = new Integer(c);
			map.put(i, i);
		}
	}
}


输出
|| A9ICMaker.make():SingleThread || 1273 ||
clear=1294900633538,count=0
clear=1294900633553,count=7533
clear=1294900633569,count=71077
clear=1294900633584,count=44649
clear=1294900633600,count=60189
clear=1294900633616,count=77277
clear=1294900633631,count=72338
clear=1294900633647,count=60071
clear=1294900633663,count=79539
clear=1294900633678,count=75039
clear=1294900633694,count=55106
clear=1294900633709,count=85094
clear=1294900633725,count=78181
clear=1294900633741,count=57666
clear=1294900633756,count=93585
clear=1294900633772,count=16451
clear=1294900633788,count=88381
clear=1294900633803,count=32323
clear=1294900633819,count=72507
clear=1294900633834,count=57766
clear=1294900633850,count=56261
clear=1294900633866,count=95639
clear=1294900633881,count=15986
clear=1294900633897,count=88842
clear=1294900633913,count=23015
clear=1294900633928,count=81801
clear=1294900633944,count=39540
clear=1294900633959,count=65284
clear=1294900633975,count=71901
clear=1294900633991,count=65975
clear=1294900634006,count=71771
clear=1294900634022,count=60254
clear=1294900634038,count=55864
clear=1294900634053,count=93507
clear=1294900634069,count=19888
clear=1294900634084,count=84916
clear=1294900634100,count=33104
clear=1294900634116,count=71716
clear=1294900634131,count=57352
clear=1294900634147,count=56235
clear=1294900634163,count=96052
clear=1294900634178,count=15489
clear=1294900634194,count=85669
clear=1294900634209,count=93119
clear=1294900634225,count=84102
clear=1294900634241,count=64900
clear=1294900634256,count=75998
clear=1294900634272,count=50408
clear=1294900634288,count=54407
clear=1294900634303,count=92945
clear=1294900634319,count=85162
clear=1294900634334,count=66641
clear=1294900634381,count=69714
clear=1294900634397,count=87046
clear=1294900634413,count=87289
clear=1294900634428,count=83505
clear=1294900634444,count=70047
clear=1294900634459,count=58651
clear=1294900634475,count=85536
clear=1294900634491,count=89269
clear=1294900634506,count=76467
clear=1294900634522,count=55252
|| A9ICMaker.make():SingleThread || 4101 ||

分享到:
评论

相关推荐

    java的lock和synchronized的区别.docx

    有了 synchronized 关键字,为什么还需要 lock 这个接口类呢?synchronized 的不足: 1. 如果获取锁的线程等待被执行的代码块是被阻塞了(调用了 sleep 方法/等待 IO 或其它原因),但是没有释放锁,那么这个线程...

    Synchronized_6_pulse_Generator.slx

    有需要2014版本之前的Synchronized 6-Pulse Generator元器件,提供slx文件下载,直接复制过去即可使用。Matlab表示:如果您的旧版型号包含 同步6脉冲发生器模块,它们将继续工作。但是,为获得最佳性能,请在新型号...

    第16讲synchronized底层如何实现?什么是锁...1

    【Java核心技术】synchronized是Java内置的关键字,用于实现线程同步,确保多线程环境下的数据一致性。在Java 6之后,为了提高性能,JVM引入了锁的升级和降级机制,使得synchronized在不同竞争情况下可以智能地选择...

    java关键字Synchronized详解

    ava中的关键字synchronized是一种用于实现线程同步的机制。它可以确保在同一时刻,只有一个线程能够访问被synchronized修饰的代码块或方法。这种机制可以有效地避免多线程环境下...这种竞争可能导致锁膨胀现象的发生。

    使用synchronized实现多线程同步[借鉴].pdf

    在Java编程中,多线程同步是一个至关重要的概念,特别是在并发编程中,它确保了共享资源的安全访问,防止数据不一致性和竞态条件的发生。`synchronized`关键字是Java提供的一种内置锁机制,用于实现线程同步。以下是...

    继续撩一撩Java synchronized1

    Java中的`synchronized`关键字是实现线程同步的关键机制,它确保了在多线程环境下对共享资源的访问得以正确协调,防止数据不一致和竞态条件的发生。在Java语言中,支持多线程是一个核心特性,而`synchronized`就是...

    第16讲 synchronized底层如何实现?什么是锁的升级、降级?1

    `synchronized` 关键字在 Java 中用于实现线程同步,它是 Java 内置的互斥锁,确保同一时刻只有一个线程能执行特定代码段。在深入讲解 `synchronized` 底层实现之前,我们先回顾一下锁的升级和降级的概念。 锁的...

    Java Synchronized锁失败案例及解决方案

    但是,在使用Synchronized锁时,如果锁定的对象发生改变,那么锁将不生效。这种情况称为锁失败案例。锁失败案例是指在多个线程访问同一个资源时,由于锁定的对象已经发生改变,导致锁失效,从而出现线程安全问题。 ...

    java-synchronized 嵌套使用代码详解

    在上面的代码中,我们可以看到两个线程 th1 和 th2,它们都尝试获取 a 和 b 的锁,但是由于 synchronized 的嵌套使用,导致了死锁的发生。死锁是指两个或多个线程同时等待对方的完成,而程序无法继续执行。在这个...

    详解iOS多线程之2.NSThread的加锁@synchronized

    首先,让我们了解什么是`synchronized`关键字。`synchronized`是Objective-C中的一个关键字,它提供了一种互斥访问对象的机制,确保同一时间只有一个线程能执行特定代码块,从而避免竞态条件。在上面的例子中,`...

    Java 多线程synchronized关键字详解(六)

    死锁发生在两个或更多线程相互等待对方释放资源的情况下。活锁是线程不断尝试但无法取得进展的情况。饥饿则是线程虽然有权利获得锁,但由于其他线程一直持有锁,导致无法执行。 7. **可中断锁(ReentrantLock)**:...

    Java synchronized那点事.doc

    如果一个对象在没有发生锁竞争的情况下,依然会被赋予偏向锁,这种情况称为匿名偏向。在JVM启动4秒后,默认会给新建的对象加上偏向锁。 4. 锁对象的状态转换: - 无锁状态:对象刚创建时,其锁标志位为空。 - ...

    java多线程编程之使用Synchronized块同步方法

    Java多线程编程中,`synchronized`关键字是实现线程...总之,`synchronized`关键字是Java中实现线程同步的重要工具,通过合理使用同步方法和同步代码块,我们可以确保多线程环境下的数据一致性,防止并发问题的发生。

    PHP pthreads v3下同步处理synchronized用法示例

    之所以会用到同步,是因为如果多个线程中对同一个资源进行操作时,会发生混乱。 比如2个线程对变量进行加1操作,第1个线程还没来的及改写数据时,第2个线程就对变量进行操作了,那变量最终的结果就是未知的,这个...

    深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    但需要注意的是,Lock需要程序员更加谨慎地处理线程间的交互,以防止死锁和其他并发问题的发生。 总的来说,Synchronized和Lock都是Java中解决并发问题的重要工具,它们各有优势,适用于不同的场景。在实际开发中,...

    详细解读java同步之synchronized解析

    如上文代码所示,同一个线程在同步代码块内部再次同步同一个对象时,不会发生死锁。 ### 2. synchronized的实现原理 `synchronized`的实现依赖于Java虚拟机(JVM)的 monitors(监视器锁)。在JVM层面,`...

    使用synchronized实现一个Lock代码详解

    "使用synchronized实现一个Lock代码详解" 在了解Lock和synchronized的区别之前,我们首先需要了解它们的基本概念。Lock是一个接口,它提供了一种机制来保护critical section,使得多个线程在访问共享资源时不会发生...

    java中synchronized(同步代码块和同步方法)详解及区别

    - `methodA()` 和 `methodB()` 使用相同的锁(当前对象),因此当 `t1` 调用 `methodA()` 并持有锁时,`t2` 必须等待 `t1` 完成并释放锁后才能执行 `methodB()`,这就是为什么 `methodB()` 会被延迟执行的原因。...

    java synchronized关键字的用法

    - 可能导致死锁:如果多个线程相互持有对方需要的锁,就会发生死锁。 - 不可中断:一个线程如果获得了锁,但没有及时释放,其他线程只能等待,无法强制中断。 5. 使用注意事项 - 合理选择同步范围:尽量减少同步...

    简单了解Java synchronized关键字同步

    同步块的锁是可以选择的,但不是可以任意选择的(使用一个引用对象的实例变量不是一个好的选择,因为同步块在执行过程中,可能会改变它的值,比如设置为 null,而对一个 null 对象加锁会发生异常,并且对不同的对象...

Global site tag (gtag.js) - Google Analytics