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

分享到:
评论

相关推荐

    volatile和synchronized的区别

    而使用`volatile`时,不会发生线程阻塞。 #### 四、使用建议 - 对于简单的状态变量(如标志位)的可见性保证,推荐使用`volatile`,因为它更轻量级且性能更好。 - 当需要实现互斥访问或复合操作的原子性时,应选择...

    synchronized关键字的用法详解

    3. **可重入性**:如果一个线程已经持有了一个对象的锁,那么它还可以再次获取该对象的锁,而不会发生死锁。每次获取锁都会使锁的计数器加1,相应的释放锁也会使计数器减1,只有计数器变为0时,锁才会被释放。 ####...

    [JAVA][synchronized的使用]

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

    synchronized与单例的线程安全

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

    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`)和非公平锁(默认)...

    java_synchronized详解

    - **锁的可重入性**:`synchronized`支持可重入锁,这意味着一个已经获得锁的线程可以再次进入同一锁保护的区域,而不会发生死锁。 综上所述,`synchronized`关键字为Java提供了强大的同步机制,可以帮助开发者有效...

    详细解读java同步之synchronized解析

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

    Synchronized Phasor Measurements and Their Applications

    同步相量测量技术(Synchronized Phasor Measurements,简称SPM)是电力系统监测、分析与控制领域的一项关键技术。该技术通过高精度的时间同步机制(如全球定位系统GPS)实现了电网中各点电压和电流相量的精确测量,...

    OC-@synchronized

    例如,两个线程分别持有不同对象的锁,互相等待对方释放锁,就会发生死锁。 6. **替代方案**:除了 `@synchronized`,OC 中还有其他并发控制机制,如 NSLock、NSConditionLock、GCD 的同步队列(dispatch_sync)等...

    NSLock和@synchronized

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

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

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

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

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

    java-synchronized 嵌套使用代码详解

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

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

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

    继续撩一撩Java synchronized1

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics