线程
进程和线程有什么区别?
进程是指应用程序在运行时的状态,进程会占用系统的cpu以及内存资源。线程是指进程当中的执行流程,多个线程协同工作,会共同使用进程的资源,才确保进程的功能得以实现。
Java当中如何实现线程呢?
继承Thread类
实现runnable接口,只是任务类,还需手动创建线程对象
线程池机制来创建和管理线程 ThreadPool
singleThreadPool 创建一个线程的线程池
fixedThreadPool 创建固定数量的线程池
cachedThreadPool 数量可缓存的线程池
scheduledThreadPool 有定时功能的线程池
线程的生命周期
新建状态(new一个线程的时候)
调用线程.start方法的时候,等待cpu分配时间片。
可运行状态
当cpu分配到了时间片之后,线程开始运行,运行run方法当中的内容。
运行状态
当线程遇到sleep、wait等方法的时候,线程会进入阻塞状态。
阻塞状态
当休眠时间到期,或者被notify了,线程又回到了可运行状态。
死亡状态
线程运行结束之后,就会销毁,被jvm的gc回收。
问
多线程并发或线程安全问题如何解决?
1、通过volatile 关键字修饰变量,可以实现线程之间的可见性,避免变量脏读的出现。底层是通过限制jvm指令的重排序来实现的,适用于一个线程修改,多个线程读的场景。
2、通过synchronized锁(任意对象)来实现线程同步,自动锁的思想。底层实现原理:当有线程进入同步代码块之后,利用jvm的计数器将锁的标记置为1,当别的线程再想进入的时候,发现锁的标记为1。该线程就去锁池等待,当第一个线程出来之后,锁的标记会置为0。 之后cpu会随机分配一个线程再次进入同步代码块。
3、通过lock锁的机制,进行手动lock,和unlock,但是这种很容易出现死锁。注意加锁以及解锁的顺序,就可以避免死锁。
4、通过线程安全的集合类,可以解决并发问题。
ConcurrentHashMap
CopyonWriteArrayList
5、使用并发包下面的原子类,底层使用的是cas机制(乐观锁),可以解决并发问题 atomicInteger 线程安全的原子整型类。
6、使用线程池来创建和管理线程,也可以一定程度上解决并发问题。
7、使用ThreadLocal来修饰变量,可以解决并发问题。ThreadLocal底层是怎么实现的?多个线程会复制一份threadLocao变量的副本进行操作,互不影响,来保证线程安全的。