首页 > 其他分享 >线程死锁与线程阻塞区别?以及定位分析?

线程死锁与线程阻塞区别?以及定位分析?

时间:2024-01-15 22:14:52浏览次数:32  
标签:加锁 查看 阻塞 死锁 线程 多线程 资源

死锁的定义

线程死锁就是有两个线程,一个线程锁住了资源A,又想去锁定资源B,另外一个线程锁定了资源B,又想锁定资源A。两个线程都想去得到对方的资源,而不愿意释放自己的资源,从而造成一种相互等待,无法执行的情况。

定位分析:

查看服务器的CPU、内存、IO、网络情况:命令:dstat -tcmnd –dist-util

Jvisualvm工具进行查看,JVM是非常平稳的

查看tomcat的进程,然后使用jstack查看对应的进程ID,打印堆栈信息。

Ps -ef | grep tomcat          jstact 8086 > test.log

线程阻塞的定义

多线程情况下,如果一个线程对拥有某个资源的锁,那么这个线程就可以运行资源相关的代码。而其他线程就只能等待其执行完毕后,才能继续争夺资源锁,从而运行相关代码。当多个用户同时操作的时候,就会导致商品超出库存售卖,这个就设计到多线程模式下的数据安全问题。关于这个场景其实在工作中是非常多的,如优惠券领取,最后一个优惠券库存的时候,多个用户同时领取,是否会出现都领取成功的情况。
解决方案
出现上方这种情况下,通常我们都需要通知开发进行加锁。在多线程的情况下,如果存在修改共享数据的操作,就需要对操作步骤进行加锁,拥有锁的线程才可以执行相关代码。没有锁的线程只能等待其释放后,才有资格执行代码。但是大家现在思考一下,加锁之后是不是就存在了一定的性能问题,加锁之后,只有锁内部的线程才能执行业务操作,其他的线程都处于等待的状态,这样就会导致出现性能瓶颈。但是这个通常都需要根据业务来决定,在某些业务上安全性高于性能。

标签:加锁,查看,阻塞,死锁,线程,多线程,资源
From: https://www.cnblogs.com/yongheng999/p/17966481

相关文章

  • 还不敢写多线程程序?看看Go如何让并发控制简单有趣
    还不敢写多线程程序?看看Go如何让并发控制简单有趣原创 萤火架构 萤火架构 2024-01-1219:50 发表于北京 听全文所谓并发控制,就是同一程序进程内不同线程间访问相同资源时的冲突处理,有时也称为进程内同步。比如一个简单的内存累加计数操作,如果不进行同步,不同的线程可......
  • 关于ArcEngine在多线程模式下的注意点
    仅以我的环境来描述的我问题和解决方案,超出该范围的暂时没有考虑。一、环境ArcEngine10.2语言:C#.net版本:4.6.1二、需求创建GDB数据库,并从json文件把数据写入GDB中,包含了图形数据,为了兼顾效率,我使用了多线程来生成GDB,但也做了控制,一个线程只会对一个GDB进行操作。三、问题:......
  • python多线程模块:threading使用方法(参数传递)
    先来看这段代码:importthreadingimporttimedefworker():print“worker”time.sleep(1)returnforiinxrange(5):t=threading.Thread(target=worker)t.start()这段代码就使用了多线程,但是没法传递参数,而实际使用多线程,往往是需要传递参数的......
  • C#线程篇---Task(任务)和线程池不得不说的秘密
    C#线程篇---Task(任务)和线程池不得不说的秘密 我们要知道的是,QueueUserWorkItem这个技术存在许多限制。其中最大的问题是没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成是获得一个返回值,这些问题使得我们都不敢启用这个技术。Microsoft为了克服......
  • 并发重要知识点—线程池详解
    https://blog.csdn.net/qq_40270751/article/details/78843226 创建线程的另一种方法是实现Runnable接口。Runnable接口中只有一个run()方法,它非Thread类子类的类提供的一种激活方式。一个类实现Runnable接口后,并不代表该类是一个“线程”类,不能直接运行,必须通过Thread实例才......
  • CompletableFuture多线程与redis分布式锁
    @AutowiredpublicRedisTemplateredisTemplate;booleanlock=redisTemplate.opsForValue().setIfAbsent("lock","redisLock");//获取锁      booleanredisLock=redis.getRedisLock();      if(redisLock){        //创建线......
  • 为什么C++ 单例局部static初始化是线程安全的?
    为什么C++单例局部static初始化是线程安全的?constbg::AppSettings&bg::AppSettings::GetInstance(){staticAppSettingsinstance;returninstance;}对于以上单例模式代码,在C++11(及更高版本)中,函数局部静态AppSettings的构造保证是线程安全的。编译器将在AppS......
  • 多线程
    01-程序、进程与线程1.程序、进程和线程的区分:程序(program):为完成特定任务,用某种语言编写的`一组指令的集合`。即指一段静态的代码。进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。程序是静态的,进程是动态的。进程作为操作系统调度和分配......
  • 在Ubuntu 20.04.1 LST上安装摩尔线程MTT S80驱动
    在Ubuntu20.04.1LST上安装摩尔线程MTTS80驱动1.Ubuntu指定版本下载,不要搞错。http://old-releases.ubuntu.com/releases/20.04.1/ubuntu-20.04.1-desktop-amd64.iso2.UltralISO制作U盘启动盘,安装系统,期间不要更新系统和软件。3.重启一次,有线网络自动启用。4.重启,......
  • boost框架 创建websocket非阻塞服务
    #include<iostream>#include<boost/asio.hpp>#include<boost/beast.hpp>#include<boost/beast/websocket.hpp>namespaceasio=boost::asio;namespacebeast=boost::beast;namespacewebsocket=beast::websocket;usingtcp=asio::......