首页 > 其他分享 >线程的活跃性

线程的活跃性

时间:2022-12-03 15:00:38浏览次数:33  
标签:Thread t2 t1 活跃性 线程 new public

一、死锁

有A,B两把锁,t1持有A想获取B,t2持有B想获取A,导致t1 t2两个线程最终都进入阻塞状态的现象

public class Test8 {

    private final static Logger LOGGER = LoggerFactory.getLogger(Test8.class);

    private final static Object lockA= new Object();
    private final static Object lockB= new Object();

    public static void main(String[] args) {

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lockA){
                    LOGGER.info("持有A");
                    synchronized (lockB){
                        LOGGER.info("持有B");
                    }
                }
            }
        },"t1");

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lockB){
                    LOGGER.info("持有B");
                    synchronized (lockA){
                        LOGGER.info("持有A");
                    }
                }
            }
        },"t2");

        t1.start();
        t2.start();

    }
}

如何解决:

可以使用ReentrantLock中的tryLock,或者lockInterruptibly,这些能够在某些条件下主动放弃争抢锁的方法

二、活锁

两个线程互相改变对方的结束条件,最终两个线程都不能正常结束的现象

public class Test8 {

    private final static Logger LOGGER = LoggerFactory.getLogger(Test8.class);

    private  static volatile int i=10;

    public static void main(String[] args) {

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (i>0){
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    i--;
                    LOGGER.info("i:"+i);

                }
            }
        },"t1");

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (i<20){
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    i++;
                    LOGGER.info("i:"+i);

                }
            }
        },"t2");

        t1.start();
        t2.start();

    }
}

解决办法:增加随机的睡眠时间,或者t2里写i=i+20 这样t2会有更大的可能先结束,然后就没有线程修改t1的结束条件了,t1就可以结束了

三、饥饿

一个线程由于优先级太低始终抢不到cpu执行权而不能被执行,所以一直不能结束

标签:Thread,t2,t1,活跃性,线程,new,public
From: https://www.cnblogs.com/chengxuxiaoyuan/p/16947697.html

相关文章

  • JUC高级篇-第2章 多线程锁
    1.乐观锁与悲观锁悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。适合写操作多的场景,先加锁可以保......
  • 控制多个线程的执行顺序
    记录了如何控制多个线程的执行顺序,以练习题的形式记录一、两个线程顺序执行题目描述:线程t1会打印A,线程t2会打印B,实现先打印B再打印A题目分析:实现的关键是线程1执行......
  • Python笔记-多进程多线程
    日常运维中,经常需要并发来提升工作效率。Python提供了多线程和多进程两种方式。importtimeimportthreadingimportmultiprocessingdefprint_fun(num):print(time.str......
  • 添加线程组
    取样器错误后要执行的动作:继续,停止线程,停止测试线程数:可理解为当前线程组下脚本运行的“并发用户数”。Ramp­UpPeriod(inseconds):开始运行时线程数在“设定的时间”内......
  • 多线程
    静态代理各种内部类yieldjoin后是继续执行不是重新开始sleep的性质sleep不会释放锁?wait会每个线程都有自己的工作内存内存都是各自的互不影响是拷贝过去的......
  • 处理器从单核到多核的演化过程Linux-查看系统CPU个数、核心数、线程数
    Linux-查看系统CPU个数、核心数、线程数1.CPU个数(socket的个数)cat/proc/cpuinfo|grep"physicalid"|sort|uniq|wc-l2.每个CPU的核心数grep'coreid'/proc/cpuinfo......
  • c++的线程安全静态检查 Thread Safety Analysis
    leveldb源码的过程中,发现很多成员变量被GUARDED_BY修饰,如下:structIterState{port::Mutex*constmu;Version*constversionGUARDED_BY(mu);MemTable*const......
  • <二>强弱指针使用场景之 多线程访问共享对象问题
    代码1#include<iostream>#include<thread>usingnamespacestd;classA{public: A(){cout<<"A()"<<endl;} ~A(){cout<<"~A()"<<endl;} vo......
  • Listview中使用线程实现无限加载更多项目的功能
    在现在的SINA微博或者象twitter,dzone等网站中,当加载一个很长的列表时,往往都是先加载部分内容,然后当用户用拖拉条往下拖动时,再加载更多的内容.这......
  • Redis中的单线程多路复用的一个通俗解析
    在尚学堂的课程中,有个不错的单线程多路复用的通俗解析,觉得不错:其实就是黄牛买票,黄牛是单线程了,但他能服务很多买票的人,买票的人也不需要去等待的 ......