page contents
Nen
Nen - 程序员

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

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

3096 个回答

0 赞同

synchronized 和 volatile 的区别是什么?

1. volatile 本质是在告诉 JVM当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 2. volatile 仅能使用在变量级别;synchronized 则可以使用在变量、方法、和类级别的。 3. volatile 仅能实现变量的修改可见性,不能保证...

回答于 2022-01-24 13:54

0 赞同

谈一下你对 volatile 关键字的理解?

volatile 关键字是用来保证有序性和可见性的。这跟 Java 内存模型有关。我们所写的代码,不一定是按照我们自己书写的顺序来执行的,编译器会做重排序,CPU 也会做重排序的,这样做是为了减少流水线阻塞,提高 CPU 的执行效率。这就需要有一定的顺序和规则来保证,不然程序员自己写的代码都不知道对不对了,所以有 happens-b...

回答于 2022-01-24 13:54

0 赞同

说下对 ReentrantReadWriteLock 的理解?

ReentrantReadWriteLock 允许多个读线程同时访问,但是不允许写线程和读线程、写线程和写线程同时访问。读写锁内部维护了两个锁:一个是用于读操作的 ReadLock,一个是用于写操作的 WriteLock。读写锁 ReentrantReadWriteLock 可以保证多个线程可以同时读,所以在读操作远大于写操作的时候,读写锁就非常有用了。 Reentran...

回答于 2022-01-24 13:53

0 赞同

说下对悲观锁和乐观锁的理解?

悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如:行锁、表锁、读锁、写锁等,都是在做...

回答于 2022-01-24 13:52

0 赞同

乐观锁常见的两种实现方式是什么?

乐观锁一般会使用版本号机制或者 CAS 算法实现。 版本号机制 一般是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数,当数据被修改时,version 值会加 1。当线程 A 要更新数据值时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值为当前数据库中的 version 值相等时才...

回答于 2022-01-24 13:48

0 赞同

乐观锁的缺点有哪些?

1. ABA 问题 如果一个变量 V 初次读取的时候是 A 值,并且在准备赋值的时候检查到它仍然是 A 值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回 A,那 CAS 操作就会误认为它从来没有被修改过。这个问题被称为 CAS 操作的 “ABA” 问题。 JDK 1.5 以后...

回答于 2022-01-24 13:47

0 赞同

CAS 和 synchronized 的使用场景?

简单的来说 CAS 适用于写比较少的情况下(多读场景,冲突一般较少),synchronized 适用于写比较多的情况下(多写场景,冲突一般较多)。 1、对于资源竞争较少(线程冲突较轻)的情况,使用 synchronized 同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗 cpu 资源;而 CAS 基于硬件实现,不需要进...

回答于 2022-01-24 13:46

0 赞同

创建线程的几种方式?

1、继承 Thread 类创建线程; 2、实现 Runnable 接口创建线程; 3、通过 Callable 和 Future 创建线程; 4、通过线程池创建线程。

回答于 2022-01-22 16:04

0 赞同

Runnable 和 Callable 有什么区别?

1、Runnable 接口中的 run() 方法的返回值是 void,它做的事情只是纯粹地去执行 run() 方法中的代码而已; 2、Callable 接口中的 call() 方法是有返回值的,是一个泛型,和 Future、FutureTask 配合可以用来获取异步执行的结果。

回答于 2022-01-22 16:04

0 赞同

线程状态及转换?

Thread 的源码中定义了6种状态:new(新建)、runnnable(可运行)、blocked(阻塞)、waiting(等待)、time waiting (定时等待)和 terminated(终止)。

回答于 2022-01-22 16:03