多线程理解

作者: Thor_92 | 来源:发表于2019-11-27 00:36 被阅读0次

    多线程指的是多个操作同时进行,并发处理。

    优点是可以最大限度利用硬件,程序响应时间缩短,优化用户体验。

    弊端是线程滥用可能造成内存溢出或者栈溢出,线程之间竞争资源,内存共享问题。

    首先,在使用线程线程的时候,避免直接去new 一个Thread直接执行,这样对线程没有一个把控。应该选择使用线程池来提供线程。但是线程池最好不要用Executors去创建,因为它提供的每一个创建线程池的方法都存在内存泄露的风险(要么是maxintsize大小的队列,要么0大小的队列),所以线程池方面最好也自己手动去创建维护。

    在多线程中常用到wait notify notifyall。这三个方法是Object中提供的,说明锁的级别是对象而不是线程。使用这三个方法的前提是在synchronize锁之内。如果多个线程同时start去获取同一个对象的锁,其中一个首先获得了对象锁,那么其他的线程就会进行等待,这时候如果获得对象锁的线程调用了锁住的对象的wait方法,那么该线程会让出锁并进入等待状态,等待被唤醒。同时其他几个等待获取对象锁的线程会开始竞争对象锁。假设这时候其中的一个线程获取到了对象的锁,那么其他线程又会进入一个等待获取锁的状态。假如获取到对象锁的线程执行完相应业务之后调用了锁对象的notify方法,这时候会唤醒任意一个在当前锁对象为wait状态的线程,让它们准备在当前线程释放锁之后去竞争锁对象。notifyall和notify的区别在于,前者是唤醒所有当前锁对象状态为wait的线程,而后者是唤醒随机一个。

    多线程之间内存共享问题,多个线程之间是通过共享内存来通信的。java内存模型jmm保证了多线程之间的共享变量的一致性。首先在jmm中,每一个线程都有一个私有的内存空间,而共享变量存在于主内存。要保证共享变量的一致性,要么获取锁来操作,要么使用volatile关键字来修饰共享变量。

    当一个被volatile修饰共享变量被其中一个线程所修改,jmm会通知其他线程把各个线程私有内存上的共享变量缓存清除掉,需要使用该变量的时候需要去主存上去重新取。通过这种方式来保证变量一致性。

    synchronize是直接把该共享变量锁住,其他线程只能等待锁释放了才能继续操作。

    相关文章

      网友评论

        本文标题:多线程理解

        本文链接:https://www.haomeiwen.com/subject/uwsuwctx.html