问题
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`时,不会发生线程阻塞。 #### 四、使用建议 - 对于简单的状态变量(如标志位)的可见性保证,推荐使用`volatile`,因为它更轻量级且性能更好。 - 当需要实现互斥访问或复合操作的原子性时,应选择...
3. **可重入性**:如果一个线程已经持有了一个对象的锁,那么它还可以再次获取该对象的锁,而不会发生死锁。每次获取锁都会使锁的计数器加1,相应的释放锁也会使计数器减1,只有计数器变为0时,锁才会被释放。 ####...
- **避免死锁**:虽然`synchronized`不能完全避免死锁,但它可以帮助降低发生死锁的概率,因为它强制线程顺序访问资源。 5. **synchronized的局限性** - 性能开销:由于同步会带来上下文切换和锁竞争,所以过多...
2. 饿汉式(静态代码块):与上述类似,只是初始化发生在静态代码块中。 3. 懒汉式(线程安全):在多线程环境中,使用`synchronized`保证实例化过程的线程安全,但可能导致性能下降。 ```java public class ...
有了 synchronized 关键字,为什么还需要 lock 这个接口类呢?synchronized 的不足: 1. 如果获取锁的线程等待被执行的代码块是被阻塞了(调用了 sleep 方法/等待 IO 或其它原因),但是没有释放锁,那么这个线程...
有需要2014版本之前的Synchronized 6-Pulse Generator元器件,提供slx文件下载,直接复制过去即可使用。Matlab表示:如果您的旧版型号包含 同步6脉冲发生器模块,它们将继续工作。但是,为获得最佳性能,请在新型号...
- 它是可重入的,即一个线程可以多次获取同一锁,不会发生死锁。 2. **使用方式**: - `ReentrantLock`提供`lock()`和`unlock()`方法来加锁和解锁。 - 支持公平锁(通过构造函数传入`true`)和非公平锁(默认)...
- **锁的可重入性**:`synchronized`支持可重入锁,这意味着一个已经获得锁的线程可以再次进入同一锁保护的区域,而不会发生死锁。 综上所述,`synchronized`关键字为Java提供了强大的同步机制,可以帮助开发者有效...
如上文代码所示,同一个线程在同步代码块内部再次同步同一个对象时,不会发生死锁。 ### 2. synchronized的实现原理 `synchronized`的实现依赖于Java虚拟机(JVM)的 monitors(监视器锁)。在JVM层面,`...
同步相量测量技术(Synchronized Phasor Measurements,简称SPM)是电力系统监测、分析与控制领域的一项关键技术。该技术通过高精度的时间同步机制(如全球定位系统GPS)实现了电网中各点电压和电流相量的精确测量,...
例如,两个线程分别持有不同对象的锁,互相等待对方释放锁,就会发生死锁。 6. **替代方案**:除了 `@synchronized`,OC 中还有其他并发控制机制,如 NSLock、NSConditionLock、GCD 的同步队列(dispatch_sync)等...
`@synchronized`的加锁和解锁操作是原子性的,因此不会发生数据竞争。然而,与`NSLock`不同,`@synchronized`不支持嵌套锁定,如果在已锁定的对象上调用`synchronized`,会抛出异常。 两者在性能上也有所差异。`@...
比如死锁,当两个或更多线程相互等待对方释放资源时,就会发生死锁。避免死锁的关键在于遵循正确的资源获取顺序。此外,还有活锁和饥饿问题,活锁是线程不断尝试但无法推进的状态,饥饿则是线程由于各种原因无法获得...
【Java核心技术】synchronized是Java内置的关键字,用于实现线程同步,确保多线程环境下的数据一致性。在Java 6之后,为了提高性能,JVM引入了锁的升级和降级机制,使得synchronized在不同竞争情况下可以智能地选择...
在上面的代码中,我们可以看到两个线程 th1 和 th2,它们都尝试获取 a 和 b 的锁,但是由于 synchronized 的嵌套使用,导致了死锁的发生。死锁是指两个或多个线程同时等待对方的完成,而程序无法继续执行。在这个...
在Java编程中,多线程同步是一个至关重要的概念,特别是在并发编程中,它确保了共享资源的安全访问,防止数据不一致性和竞态条件的发生。`synchronized`关键字是Java提供的一种内置锁机制,用于实现线程同步。以下是...
Java中的`synchronized`关键字是实现线程同步的关键机制,它确保了在多线程环境下对共享资源的访问得以正确协调,防止数据不一致和竞态条件的发生。在Java语言中,支持多线程是一个核心特性,而`synchronized`就是...
`synchronized` 关键字在 Java 中用于实现线程同步,它是 Java 内置的互斥锁,确保同一时刻只有一个线程能执行特定代码段。在深入讲解 `synchronized` 底层实现之前,我们先回顾一下锁的升级和降级的概念。 锁的...
但是,在使用Synchronized锁时,如果锁定的对象发生改变,那么锁将不生效。这种情况称为锁失败案例。锁失败案例是指在多个线程访问同一个资源时,由于锁定的对象已经发生改变,导致锁失效,从而出现线程安全问题。 ...