page contents
Nen
Nen - 程序员

性别: 天津 - 天津市 注册于 2021-06-23

向TA求助
2850金币数
43180 经验值
1个粉丝
主页被访问 6257 次

3096 个回答

0 赞同

什么是ConcurrentHashMap?

ConcurrentHashMap是Java中的一个线程安全且高效的HashMap实现。平时涉及高并发如果要用map结构,那第一时间想到的就是它。相对于hashmap来说,ConcurrentHashMap就是线程安全的map,其中利用了锁分段的思想提高了并发度。 那么它到底是如何实现线程安全的? JDK 1.6版本关键要素: segment继承了ReentrantLock充当锁的...

回答于 2022-04-27 14:56

0 赞同

Java 中 ConcurrentHashMap 的并发度是什么?

ConcurrentHashMap 把实际 map 划分成若干部分来实现它的可扩展性和线程安全。这种划分是使用并发度获得的,它是 ConcurrentHashMap 类构造函数的一个可选参数,默认值为 16,这样在多线程情况下就能避免争用。 在 JDK8 后,它摒弃了 Segment(锁段)的概念,而是启用了一种全新的方式实现,利用 CAS 算法。同时加入了更多...

回答于 2022-04-27 14:55

0 赞同

volatile 类型变量提供什么保证?能使得一个非原子操作变成原子...

volatile 提供 happens-before 的保证,确保一个线程的修改能对其他线程是可见的。但无法保证原子性,对于多个线程访问同一个实例变量需要加锁进行同步。 在 Java 中除了 long 和 double 之外的所有基本类型的读和赋值,都是原子性操作。而 64 位的 long 和 double 变量由于会被 JVM 当作两个分离的 32 位来进行操作,所以...

回答于 2022-04-25 16:12

0 赞同

volatile 关键字的作用是什么?

对于可见性,Java 提供了 volatile 关键字来保证可见性和禁止指令重排。volatile 提供 happens-before 的保证,确保一个线程的修改能对其他线程是可见的。当一个共享变量被 volatile 修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。 从实践角度而言,volatile 的一个重要作...

回答于 2022-04-25 16:10

0 赞同

Java 中能创建 volatile 数组吗?

能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。意思是,如果改变引用指向的数组,将会受到 volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 标示符就不能起到之前的保护作用了。

回答于 2022-04-25 16:09

0 赞同

双重检查单例为什么要使用volatile修饰?

代码如下: public class Singleton {     private volatile static Singleton uniqueInstance;     private Singleton() {     }     public static Singleton getUniqueInstance() {        //先判断对象是否已经实例过,没有实例化过才进入加锁代码         if (uniqueInstance == null) {             //类对象...

回答于 2022-04-25 16:04

0 赞同

怎么防止死锁?

我们只要破坏产生死锁的四个条件中的其中一个就可以了。 尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。 尽量使用 Java.util.concurrent 并发类代替自己手写锁。 尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。 尽量减少同...

回答于 2022-04-25 16:01

0 赞同

什么是线程饿死,什么是活锁?

当所有线程阻塞,或者由于需要的资源无效而不能处理,不存在非阻塞线程使资源可用。 JavaAPI 中线程活锁可能发生在以下情形: 当所有线程在序中执行 Object.wait(0),参数为 0 的 wait 方法。程序将发生活锁直到在相应的对象上有线程调用 Object.notify() 或者 Object.notifyAll()。 当所有线程卡在无限循环中。

回答于 2022-04-25 16:00

0 赞同

多线程中的忙循环是什么?

忙循环就是程序员用循环让一个线程等待,不像传统方法 wait(), sleep() 或 yield() 它们都放弃了 CPU 控制,而忙循环不会放弃 CPU,它就是在运行一个空循环。这么做的目的是为了保留 CPU 缓存。 在多核系统中,一个等待线程醒来的时候可能会在另一个内核运行,这样会重建缓存。 为了避免重建缓存和减少等待重建的时间就可...

回答于 2022-04-25 15:59

0 赞同

什么是不可变对象,它对写并发应用有什么帮助?

final修饰的为不可变对象 不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。 不可变对象的类即为不可变类(Immutable Class)。Java 平台类库中包含许多不可变类,如 String、基本类型的包装类、BigInteger 和 BigDecimal 等。 只有...

回答于 2022-04-25 15:59