复习总结 2023.5.25

一、在不加锁的情况下如何实现线程安全?

一般情况下解决线程安全问题的方式是增加同步锁,常见的就是Synchronized、lock等方式,由于导致线程安全问题的根本原因就是多线程并行访问共享资源,对共享资源进行加锁后,必须先获得锁,也就是获得访问资格。同步锁在同一时刻只允许一个线程访问共享资源,直到锁被释放。虽然可以解决线程安全问题,但是加锁和释放锁的过程会造成性能开销(加锁带来上下文切换)
无锁并发概念实现不加锁解决线程安全问题:
1、通过自旋锁(CAS),在线程还没有抢占资源的情况下,先自旋指定次数去尝试获得锁
2、乐观锁:给每个数据增加一个版本号,一旦数据发生变化,就修该这个版本号。在Java中通过CAS机制来完成乐观锁的这个功能
3、在程序设计中尽量减少共享对象的使用,从业务上实现隔离避免并发

二、线程两次调用start()方法会有什么问题?

Java中一个线程只能调用一次start()方法,第二次调用会抛出一个IllegalThreadStateException(非法线程状态异常),第一次调用start()方法时,该线程可能处于终止状态或者非NEW状态下的一个其他状态,再次调用时,相当于让正在运行的线程重新运行一遍,这是不合理的,所以在去运行一个线程时,会先去判断当前线程的一个运行状态
一个线程的生命周期:新建(new)、就绪(start)、运行(线程调度器调度执行)、阻塞(如:sleep方法)、消亡(任务执行结束,线程终止)

三、Kafaka如何保证消息消费的顺序性?

在kafaka架构中使用了Partition分区机制来实现消息的物理存贮,也就是说在同一个topic里面可以维护多个Partition来实现消息的一个分片,生产者在发送消息的时候会根据消息的key进行取模,来决定把当前的消息存到哪个Partition中,而且消息是按先后有序的去存储在Partition里面。所以一般解决办法就是自定义消息分区的一个路由算法,把指定的key都发送到同一个Partition中,然后专门指定消费者去消费某一个分区里的消息,这样就保证了消息的有序性

四、Synchronized和lock的区别?

1、从功能上说:Synchronized和lock都是Java中用来解决线程安全问题的一个工具
2、从特性来看:Synchronized是Java中的同步关键字,而lock是J.U.C包中提供的接口,其实现类有很多,其中就包括ReentrantLock这样一个重入锁。lock只有同步代码块方式的锁,而Synchronized有同步代码块方式和同步方法两种锁。
3、从灵活度上来看:lock的灵活度比Synchronized高,lock可以自主决定什么时候加锁,什么时候释放锁,是显示锁。而Synchronized锁的释放是被动的,只有当Synchronized锁定的代码块执行结束以后时候锁才会被释放,是隐式锁。
4、lock提供了公平锁和非公平锁的机制。公平锁是指线程在竞争资源的时候,如果已经有其他线程正在排队或者在等待锁资源释放,那么当期竞争锁的线程是无法去插队的;而非公平锁,就是不管是否有线程在排队等待锁,它都会去尝试获取锁。而Synchronized只提供了非公平锁的机制。
5、从性能上看:使用Lock锁方式时,Java虚拟机将花费较少的时间来调度线程,因此性能更好。

五、使用线程池的好处?

1、降低资源消耗,通过重复利用现有的线程来执行任务,避免因多次创建和销毁线程造成的资源消耗
2、提高响应速度,省去了创建线程这个步骤,所以在拿到任务时,就可以立刻开始执行
3、提供附加功能,线程池的可拓展性使得我们可以自己加入新的功能,比如说定时、延时来执行某些线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个射手座的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值