`
trydofor
  • 浏览: 147207 次
  • 性别: 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 ||

分享到:
评论

相关推荐

    synchronized与单例的线程安全

    2. 饿汉式(静态代码块):与上述类似,只是初始化发生在静态代码块中。 3. 懒汉式(线程安全):在多线程环境中,使用`synchronized`保证实例化过程的线程安全,但可能导致性能下降。 ```java public class ...

    [JAVA][synchronized的使用]

    - **避免死锁**:虽然`synchronized`不能完全避免死锁,但它可以帮助降低发生死锁的概率,因为它强制线程顺序访问资源。 5. **synchronized的局限性** - 性能开销:由于同步会带来上下文切换和锁竞争,所以过多...

    java的lock和synchronized的区别.docx

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

    Synchronized_6_pulse_Generator.slx

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

    ReentrantLock与synchronized

    - 它是可重入的,即一个线程可以多次获取同一锁,不会发生死锁。 2. **使用方式**: - `ReentrantLock`提供`lock()`和`unlock()`方法来加锁和解锁。 - 支持公平锁(通过构造函数传入`true`)和非公平锁(默认)...

    NSLock和@synchronized

    `@synchronized`的加锁和解锁操作是原子性的,因此不会发生数据竞争。然而,与`NSLock`不同,`@synchronized`不支持嵌套锁定,如果在已锁定的对象上调用`synchronized`,会抛出异常。 两者在性能上也有所差异。`@...

    Synchronized_思维导图(全面).xmind.zip

    比如死锁,当两个或更多线程相互等待对方释放资源时,就会发生死锁。避免死锁的关键在于遵循正确的资源获取顺序。此外,还有活锁和饥饿问题,活锁是线程不断尝试但无法推进的状态,饥饿则是线程由于各种原因无法获得...

    第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个线程就对变量进行操作了,那变量最终的结果就是未知的,这个...

    java Thread & synchronized & concurrent 线程、同步、并发

    死锁发生在两个或多个线程互相等待对方释放资源,导致所有线程都无法继续执行。活锁则类似,但线程不是阻塞,而是不断地尝试,但永远无法成功。饥饿是指线程虽然有权利获取资源,但由于其他线程一直占用,导致无法...

Global site tag (gtag.js) - Google Analytics