问题
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 ||
分享到:
相关推荐
2. 饿汉式(静态代码块):与上述类似,只是初始化发生在静态代码块中。 3. 懒汉式(线程安全):在多线程环境中,使用`synchronized`保证实例化过程的线程安全,但可能导致性能下降。 ```java public class ...
- **避免死锁**:虽然`synchronized`不能完全避免死锁,但它可以帮助降低发生死锁的概率,因为它强制线程顺序访问资源。 5. **synchronized的局限性** - 性能开销:由于同步会带来上下文切换和锁竞争,所以过多...
有了 synchronized 关键字,为什么还需要 lock 这个接口类呢?synchronized 的不足: 1. 如果获取锁的线程等待被执行的代码块是被阻塞了(调用了 sleep 方法/等待 IO 或其它原因),但是没有释放锁,那么这个线程...
有需要2014版本之前的Synchronized 6-Pulse Generator元器件,提供slx文件下载,直接复制过去即可使用。Matlab表示:如果您的旧版型号包含 同步6脉冲发生器模块,它们将继续工作。但是,为获得最佳性能,请在新型号...
- 它是可重入的,即一个线程可以多次获取同一锁,不会发生死锁。 2. **使用方式**: - `ReentrantLock`提供`lock()`和`unlock()`方法来加锁和解锁。 - 支持公平锁(通过构造函数传入`true`)和非公平锁(默认)...
`@synchronized`的加锁和解锁操作是原子性的,因此不会发生数据竞争。然而,与`NSLock`不同,`@synchronized`不支持嵌套锁定,如果在已锁定的对象上调用`synchronized`,会抛出异常。 两者在性能上也有所差异。`@...
比如死锁,当两个或更多线程相互等待对方释放资源时,就会发生死锁。避免死锁的关键在于遵循正确的资源获取顺序。此外,还有活锁和饥饿问题,活锁是线程不断尝试但无法推进的状态,饥饿则是线程由于各种原因无法获得...
【Java核心技术】synchronized是Java内置的关键字,用于实现线程同步,确保多线程环境下的数据一致性。在Java 6之后,为了提高性能,JVM引入了锁的升级和降级机制,使得synchronized在不同竞争情况下可以智能地选择...
ava中的关键字synchronized是一种用于实现线程同步的机制。它可以确保在同一时刻,只有一个线程能够访问被synchronized修饰的代码块或方法。这种机制可以有效地避免多线程环境下...这种竞争可能导致锁膨胀现象的发生。
在Java编程中,多线程同步是一个至关重要的概念,特别是在并发编程中,它确保了共享资源的安全访问,防止数据不一致性和竞态条件的发生。`synchronized`关键字是Java提供的一种内置锁机制,用于实现线程同步。以下是...
Java中的`synchronized`关键字是实现线程同步的关键机制,它确保了在多线程环境下对共享资源的访问得以正确协调,防止数据不一致和竞态条件的发生。在Java语言中,支持多线程是一个核心特性,而`synchronized`就是...
`synchronized` 关键字在 Java 中用于实现线程同步,它是 Java 内置的互斥锁,确保同一时刻只有一个线程能执行特定代码段。在深入讲解 `synchronized` 底层实现之前,我们先回顾一下锁的升级和降级的概念。 锁的...
但是,在使用Synchronized锁时,如果锁定的对象发生改变,那么锁将不生效。这种情况称为锁失败案例。锁失败案例是指在多个线程访问同一个资源时,由于锁定的对象已经发生改变,导致锁失效,从而出现线程安全问题。 ...
在上面的代码中,我们可以看到两个线程 th1 和 th2,它们都尝试获取 a 和 b 的锁,但是由于 synchronized 的嵌套使用,导致了死锁的发生。死锁是指两个或多个线程同时等待对方的完成,而程序无法继续执行。在这个...
首先,让我们了解什么是`synchronized`关键字。`synchronized`是Objective-C中的一个关键字,它提供了一种互斥访问对象的机制,确保同一时间只有一个线程能执行特定代码块,从而避免竞态条件。在上面的例子中,`...
死锁发生在两个或更多线程相互等待对方释放资源的情况下。活锁是线程不断尝试但无法取得进展的情况。饥饿则是线程虽然有权利获得锁,但由于其他线程一直持有锁,导致无法执行。 7. **可中断锁(ReentrantLock)**:...
如果一个对象在没有发生锁竞争的情况下,依然会被赋予偏向锁,这种情况称为匿名偏向。在JVM启动4秒后,默认会给新建的对象加上偏向锁。 4. 锁对象的状态转换: - 无锁状态:对象刚创建时,其锁标志位为空。 - ...
Java多线程编程中,`synchronized`关键字是实现线程...总之,`synchronized`关键字是Java中实现线程同步的重要工具,通过合理使用同步方法和同步代码块,我们可以确保多线程环境下的数据一致性,防止并发问题的发生。
之所以会用到同步,是因为如果多个线程中对同一个资源进行操作时,会发生混乱。 比如2个线程对变量进行加1操作,第1个线程还没来的及改写数据时,第2个线程就对变量进行操作了,那变量最终的结果就是未知的,这个...
死锁发生在两个或多个线程互相等待对方释放资源,导致所有线程都无法继续执行。活锁则类似,但线程不是阻塞,而是不断地尝试,但永远无法成功。饥饿是指线程虽然有权利获取资源,但由于其他线程一直占用,导致无法...