面试经常会遇到的->
-
进程和线程
-
操作系统中运行的多个软件 -
一个运行中的软件可能包括多个进程 -
一个运行中的进程可能包括多个线程
进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。
线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。
多线程的操作 不可避免的会出现一些未知的错误,线程不安全,死锁等。
线程同步和线程安全:
-
- synchronized-> 本质是保证方法内或代码块资源的互斥访问,即同一时间由同一个Monitor监视的代码最多只能有一个线程去操作。
- volatile-> 保证对字段的同步性,对基本数据类型的赋值操作和对象的引⽤赋值操作有效、 依然解决不了++的原⼦性问题。
- AtomicInteger基本和 volatile一样 是通用版的volatile
- ReentrantReadWriteLock->同样是「加锁」机制。但使⽤⽅式更灵活,同时也更麻烦⼀些。
线程安全问题的本质:是多个线程对共同资源的同一时间访问,当一个线程开始对资源进行写入操作,但是>还没结束,其他线程对正在写入的资源进行了读操作或者写操作,就会出现数据错误。
锁机制的本质:通过锁机制对共享资源的访问进行了限制,同一时间只有一个线程可以访问该资源,保证了数据的准确性
不论是线程安全问题,还是针对线程安全问题所衍⽣出的锁机制,它们的核⼼都在于共享的资源,⽽不是某个⽅法或者某⼏⾏代码。
Handle()->Message()->sendMessage()->Looper.pre()->MessageQueue()、Looper.loop()->when(true)->messager.next -- h.dispatchMessage()->handleMessage()
内存泄漏之-->Activity泄漏 导致泄漏的最主要原因是 内部类外部类的引用???? 你确定吗
当然这个说法是不一定的 AsyncTask官方说的也是泄漏,但是官方没有指出的是 “执⾏中的线程不会被系统回收” 一个普通的内部类没有执行中的线程的话就算持有外内类的引用也是会被GCROOT回收的
java回收策略是 GcRoot没有直接或间接持有引用的对象
所以即使使用Thread.start()的方式 如果持有Activity的引用也还是会内存泄漏的 ,因为执⾏中的线程不会被系统回收