java基础---多线程---细碎总结
===?2.1.1===?如何理解方法内的变量线程安全,实例变量非线程安全?
方法内变量是每个方法内部的局部变量,一定是线程安全的。
实例变量,因为不同的线程可以并发的访问这些个实例变量,所以会存在非线程安全的问题。
===?为什么int类型和string类型属性不能够作为同步监视器呢?
设想创建两个引用同时指向"abc"这个字符串,但是因为java虚拟机存在常量池,相当于两个引用同时指向了字符串常量池中的abc这个字符串,那么当使用两个引用作为监视器的时候会出现同步的效果,但是本意是想要让这两个引用作为两个对象锁存在的。
===?类锁和对象锁的区别是什么呢?类锁是放在哪里的呢?类锁的两种形式是什么样的呢?
由于一个class不论被实例化多少次,其中的静态方法和静态变量在内存中都只有一份。所以,一旦一个静态的方法被申明为synchronized。此类所有的实例化对象在调用此方法,共用同一把锁,我们称之为类锁。
由于每个java类都有一个Class对象,类的静态方法需要Class对象。所以类锁,其实就是Class对象的锁。
===?什么是线程操作的原子性和可见性?
原子性:操作不可以再进行分割。非原子性的操作就会有线程安全的问题了
可见性:线程修改状态其他线程也可以看见
===?如何理解interrupt()会让阻塞的线程中断而不会停止一个运行着的线程呢?哪些状态的线程会被中断呢?
interrupt()方法能够让阻塞线程,也就是在同步队列等待的线程中断
Thread thread = new Thread();
thread.start();
thread.inturrupt();
1.不会中断一个正在运行的线程,只会给受到阻塞的线程抛出一个中断信号。目的是让收到阻塞的线程退出被阻塞的状态。
2.如果线程被wait,join或者sleep三种方法阻塞就会接受到一个中断的异常,提早退出阻塞的状态。
this.interrupted()返回true或者false判断是否中断,同时取消掉中断标志。
this.isInterrupted()判断是否中断,不取消中断状态。
----什么是线程和进程,线程和进程区别?
线程是操作系统进行运算调度的最小单元。
进程是一段独立功能的程序在某个数据集合上的运行活动。
进程可以有多个线程,进程有独立的地址空间和内存单元,多个线程可以共享内存。
----Thread的run方法和start方法有什么区别呢?
首先对应的线程状态不一样
start()对应可执行状态,用来启动一个线程,start内部调用了run
run方法没有启动线程,只是在原先的线程中执行。
---callable接口和runnable接口的区别?
callable接口
1.可以返回参数2.可以抛出异常
runnable接口
1.无返回参数2.不能抛出异常,必须内部处理异常。
===竞态条件的定义和解决方式
多线程访问公共资源的时候如果有先后顺序的要求就会出现竞态条件。
产生竞态条件的代码就是临界区。
在竞态条件上增加同步代码就能够解决竞态条件问题。
===死锁和饥饿的概念?
死锁,线程相互等待对方释放锁导致停滞。
饥饿,部分线程一直获取不到锁导致停滞。
线程如何处理运行时异常
1.继承一个接口UncaughtExceptionHandler,实现uncaughtException方法
2.线程设置异常处理t.setDefaultUncaughtExceptionHandler(new ThreadExceptionHandler);