知乎后端一面

1.解释GMP模型

G协程,M线程,P调度器

原来是GM模型,后来加了调度器,更好支撑高并发操作。

2.乐观锁,悲观锁

乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)是数据库锁定的两种方法。

乐观锁是一种不会对数据库进行锁定的方法,而是在更新数据时使用版本号来验证数据是否已被修改。如果版本号不匹配,则说明数据已被修改,更新将被拒绝。这种方法适用于并发更新操作较少的情况,并且不会对数据库性能造成严重影响

悲观锁是一种在读取数据时对数据库进行锁定的方法,以防止其他用户修改数据。这种方法适用于并发更新操作较多的情况,但会对数据库性能造成影响

选择使用乐观锁还是悲观锁取决于应用程序的需求和数据库的性能,应根据实际情况进行选择。(来源于ChatGPT)

3.行级锁是乐观锁还是悲观锁?

行级锁是悲观锁。

行级锁是数据库锁定的一种方法,用于在数据库行级别防止数据冲突。当一个事务试图更新一行数据时,数据库将锁定该行,并防止其他事务对该行进行修改。这种方法适用于并发更新操作较多的情况,但会对数据库性能造成影响。

行级锁是悲观锁的一种实现,因为它在读取数据时对数据库进行锁定,以防止其他用户修改数据。

4.联合索引和普通索引区别
  1. 定义:普通索引是一种单独的索引,可以在一个表中为单个字段创建一个索引;而联合索引是在多个字段上创建的索引,可以提高查询效率。
  2. 数据组织方式:普通索引以B-Tree结构组织数据,而联合索引以B+Tree结构组织数据,B+Tree可以有效降低磁盘读写次数,提高查询效率
  3. 查询效率:普通索引的查询效率一般比联合索引要低,因为联合索引可以在多个字段上创建,而普通索引仅仅是在单个字段上创建。
  4. 空间占用:联合索引比普通索引要占用更多的空间,因为联合索引包含多个字段。
  5. 数据更新:联合索引在数据更新时,需要同时更新多个字段,而普通索引仅仅需要更新单个字段。
5.b树和b+树区别

B-Tree 和 B±Tree 是两种不同的树形数据结构,主要用于存储和检索大量有序数据。它们主要的区别如下:

  1. 叶子节点:B-Tree 叶子节点不存储数据,而 B±Tree 的叶子节点存储所有数据。
  2. 查询效率:由于 B±Tree 的叶子节点存储所有数据,因此它的查询效率更高,而 B-Tree 的查询效率略低。
  3. 空间利用率:B-Tree 可以更有效地利用空间,因为它的非叶子节点可以存储数据,而 B±Tree 则不能。
  4. 插入和删除操作:B-Tree 对于插入和删除操作的效率更高,因为它的非叶子节点可以存储数据,而 B±Tree 则不能。

总的来说,B±Tree 适用于查询效率要求较高的场景,而 B-Tree 适用于空间利用率和插入/删除操作要求较高的场景

6.golang线程和协程区别

Go 语言中的线程和协程是两种不同的并发技术。

  1. 线程:线程是系统级的,它在操作系统中运行。线程可以独立于其他线程运行,并且系统会为它分配资源,如内存和 CPU 时间。线程创建和管理代价高。
  2. 协程:协程是用户级的,它在程序内部运行。协程是一种比线程更轻量级的并发技术,不需要与操作系统交互,因此创建和管理代价低。协程可以共享内存,并且可以方便地控制并发执行的顺序。

总的来说,线程适用于多核并发的场景,而协程适用于单核并发的场景

7.golang用来保证数据安全的手段

Go 语言提供了以下几种方法来保证数据安全:

  1. 同步锁(sync.Mutex):控制对共享数据的访问,以保证线程安全。
  2. 原子操作(atomic):提供一系列原子操作,例如原子读取和原子更新。原子操作可以保证在单个 CPU 指令内完成,因此不存在数据不一致的风险。
  3. Channel:Go 语言提供了 channel,一种类似于队列的数据结构。通过 channel 可以安全地在不同的 Goroutine 之间传递数据。
  4. 读写锁(sync.RWMutex):对于读多写少的场景,可以使用读写锁来提高并发性能。

以上是保证数据安全的几种常见方法,但是在不同的场景中可能需要使用不同的方法。应该根据具体情况来选择适当的数据安全手段

8.java实现线程安全的手段

Java 有多种手段可以保证数据安全:

  1. synchronized 关键字:Java 中的 synchronized 关键字可以用来保证在同一时刻只有一个线程访问特定的代码块,从而避免了数据不一致的问题。
  2. volatile 关键字:Java 中的 volatile 关键字可以确保每次访问的是最新的值。
  3. Lock 接口:Java 中的 Lock 接口可以用来代替 synchronized 关键字,提供了更多的灵活性和功能。
  4. Atomic 包:Java 中的 Atomic 包提供了一系列原子操作,例如原子读取和原子更新。
  5. 线程池:Java 中的线程池可以有效地管理线程,避免因线程创建过多而导致系统资源浪费的问题。

以上是 Java 中用来保证数据安全的几种常见方法,但是在不同的场景中可能需要使用不同的方法。应该根据具体情况来选择适当的数据安全手段

9.golang和java垃圾回收区别

Golang和Java的垃圾回收有一些区别。Golang采用的是自动垃圾回收,使用了基于标记-清除和标记-整理两种算法,能够有效减少内存碎片。**而Java则采用了自适应垃圾回收算法,更灵活,但是会消耗更多的内存和处理器资源。**在使用上,Golang要比Java更简单易用,但是Java更加灵活,可以更好地适应不同的应用场景

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值