对象锁和类锁
wait sleep
AMS
activity启动流程
handler消息机制
JNI相关

1.looper.prepare()做了啥操作
https://www.cnblogs.com/ganchuanpu/p/5979103.html
2.looper如何知道当前线程是哪个线程
https://blog.csdn.net/adobesolo/article/details/75195394
3.为啥looper.loop死循环不会造成ANR
https://www.zhihu.com/question/34652589
4.asynctask缺点总结
https://blog.csdn.net/goodlixueyong/article/details/45895997
5.正确结束AsyncTask任务编码
第一步:
https://blog.csdn.net/chenleicpp/article/details/45363723
第二步:
https://www.cnblogs.com/xqxacm/p/5227159.html
https://www.cnblogs.com/hxb2016/p/6143648.html
第一步:在合适的地方将task cancel掉
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if(myTask != null && myTask.getStatus() == AsyncTask.Status.RUNNING){
myTask.cancel(true);
}
}
第二步:判断标志位,return掉
public void onProgressUpdate(Integer... value) {
// 判断是否被取消
if(isCancelled()) return;
.........
}

@Override
protected Integer doInBackground(Void... mgs) {
// Task被取消了,马上退出
if(isCancelled()) return null;

6.Java中如何正确而优雅的终止运行中的线程
https://blog.csdn.net/zhangliangzi/article/details/52484302
https://www.cnblogs.com/luckygxf/p/4737655.html
https://www.baidu.com/link?url=GfRFcHoDchCGf7au8EwY5q3LbIYnZYitHIhvnF02yNOdrvp4fWIXWvDST29RLiwoBh3bUy7-BfknD8k5BzExK_&wd=&eqid=b7b8ee5900012926000000065b0923c7
第一种方法:使用volatile标志位使用volatile标志位
第二种方法:
thread1.interrupt();
thread2.interrupt();
thread3.interrupt();
try {
Thread.sleep(1000L);
} catch (InterruptedException e) { //阻塞的话会抛出异常
e.printStackTrace();
}
//运行时的线程被中断后,只会修改中断标记,不会抛出异常
while(Thread.currentThread().isInterrupted()){
第三种方法:stop强行停止不好

7.join的理解:
https://www.cnblogs.com/lcplcpjava/p/6896904.html
自己理解:
线程2要等线程1执行完后执行,写法:
t1.start();
t1.join();
t2.start();

线程3要等线程1,2执行完之后执行,写法:
worker1.start();
worker2.start();

worker1.join();
worker2.join();

worker3.start();

7.控制线程的执行顺序:使用CountDownLatch来控制并发
https://www.cnblogs.com/flyme/p/4568063.html
初始化一个countdown值为2
CountDownLatch mCountDownLatch = new CountDownLatch(2);
如果当前线程需要等待其他线程执行完了之后再往下面走,则在当前线程中使用:
mCountDownLatch.await();进行等待操作
在其他线程中进行:
mCountDownLatch.countDown();每次减1,直到mCountDownLatch变为0,则等待线程往下执行
https://blog.csdn.net/answer100answer/article/details/77658097
CountDownLatch需要开发人员很明确需要等待的条件,否则很容易造成await()方法一直阻塞的情况。

9.CountDownLatch理解一:与join的区别
https://blog.csdn.net/zhutulang/article/details/48504487

countdown可以在线程某一步完成后countdown 1,然后在await线程可以往后执行;
而join必须等线程执行完毕后,才会往后执行

10.CyclicBarrier和CountDownLatch的区别
http://www.jb51.net/article/119064.htm
CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:

CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;

而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;

11.AQS共享模式
https://www.cnblogs.com/lfls/p/7599863.html
跟独占锁相比,共享锁的主要特征在于当一个在等待队列中的共享节点成功获取到锁以后(它获取到的是共享锁),既然是共享,那它必须要依次唤醒后面所有可以跟它一起共享当前锁资源的节点
http://www.cnblogs.com/lfls/p/7598380.html
就是尝试去获取锁,如果失败就加入一个队列中挂起。释放锁时,如果队列中有等待的线程就进行唤醒。

12.不可重入锁
https://www.jianshu.com/p/007bd7029faf

可重入锁:
可重入就意味着:线程可以进入任何一个它已经拥有的锁所同步着的代码块
https://www.cnblogs.com/dj3839/p/6580765.html

13.??
synchronized 与 lock 区别
https://blog.csdn.net/wu1226419614/article/details/73740899

虽然Lock缺少了synchronized隐式获取释放锁的便捷性,但是却拥有了锁获取与是释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized所不具备的同步特性;

两个例子超级清晰理解:
synchronized lock 区别 waitnotify 以及控制线程执行顺序
https://www.cnblogs.com/benshan/p/3551987.html

14.ReentrentLock对象和ReentrentReadWriteLock为我们日常开发中见到和用到比较多的两个类;他们都是可重入的锁,即当同一线程获取到锁之后,他在不释放锁的情况下,可以再次获取到当前已经拿到的锁,只需标记获取到锁的次数加一即可

15.上述各种锁机制的总结文章!!!
https://www.cnblogs.com/baizhanshi/p/6419268.html
他俩的区别:
(1)那么如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待,试想一下,这多么影响程序执行效率。
(2)当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象。
使用方式:
第一种:
Lock lock = ...;
lock.lock();
try{
//处理任务
}catch(Exception ex){

}finally{
lock.unlock(); //释放锁
}
第二种:
Lock lock = ...;
if(lock.tryLock()) {
try{
//处理任务
}catch(Exception ex){

}finally{
lock.unlock(); //释放锁
}
}else {
//如果不能获取锁,则直接做其他事情
}
ReadWriteLock也是一个接口
而由于synchronized和Lock都具备可重入性
读写锁将对一个资源(比如文件)的访问分成了2个锁,一个读锁和一个写锁。

正因为有了读写锁,才使得多个线程之间的读操作不会发生冲突。
ReadWriteLock就是读写锁,它是一个接口,ReentrantReadWriteLock实现了这个接口。
可以通过readLock()获取读锁,通过writeLock()获取写锁。
垃圾文章:
https://www.cnblogs.com/benshan/p/3551987.html
https://blog.csdn.net/wu1226419614/article/details/73740899

16.线程安全的CopyOnWriteArrayList介绍
https://blog.csdn.net/linsongbin1/article/details/54581787
CopyOnWrite的缺点:
1.由于写操作的时候,需要拷贝数组,会消耗内存,尤其是原数组的内容比较多的情况下;因为谁也没法保证CopyOnWriteArrayList到底要放置多少数据,万一数据稍微有点多,每次add/set都要重新复制数组,这个代价实在太高昂了。在高性能的互联网应用中,这种操作分分钟引起故障
2.不能用于实时读的场景,像拷贝数组、新增元素都需要时间,所以调用一个set操作后,读取到数据可能还是旧的,虽然CopyOnWriteArrayList 能做到最终一致性,但是还是没法满足实时性要求

17.ArrayList实现线程安全
一:使用synchronized关键字,这个大家应该都很熟悉了,不解释了;

二:使用Collections.synchronizedList()

三:使用CopyOnWriteArrayList

18.Collections.synchronizedList & CopyOnWriteArrayList对比
CopyOnWriteArrayList和Collections.synchronizedList是实现线程安全的列表的两种方式。两种实现方式分别针对不同情况有不同的性能表现,其中CopyOnWriteArrayList的写操作性能较差,而多线程的读操作性能较好。而Collections.synchronizedList的写操作性能比CopyOnWriteArrayList在多线程操作的情况下要好很多,而读操作因为是采用了synchronized关键字的方式,其读操作性能并不如CopyOnWriteArrayList。因此在不同的应用场景下,应该选择不同的多线程安全实现类
好的文章;
https://blog.csdn.net/yangzl2008/article/details/39456817
结论:
CopyOnWriteArrayList,发生修改时候做copy,新老版本分离,保证读的高性能,适用于以读为主,读操作远远大于写操作的场景中使用,比如缓存。而Collections.synchronizedList则可以用在CopyOnWriteArrayList不适用,但是有需要同步列表的地方,读写操作都比较均匀的地方

19.Java多线程之同步集合和并发集合
同步集合类:
Hashtable
Vector
同步集合包装类,Collections.synchronizedMap()和Collections.synchronizedList()

并发集合类:
ConcurrentHashMap
CopyOnWriteArrayList
CopyOnWriteHashSet

整理mianshi的更多相关文章

  1. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  2. UWP学习目录整理

    UWP学习目录整理 0x00 可以忽略的废话 10月6号靠着半听半猜和文字直播的补充看完了微软的秋季新品发布会,信仰充值成功,对UWP的开发十分感兴趣,打算后面找时间学习一下.谁想到学习的欲望越来越强 ...

  3. SQL Server 常用内置函数(built-in)持续整理

    本文用于收集在运维中经常使用的系统内置函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID') 2,查看对象的 ...

  4. kafka学习笔记:知识点整理

    一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...

  5. JAVA程序员常用软件整理下载

    ********为了大家学习方便,特意整理软件下载如下:*************Java类软件:-------------------------------JDK7.0:http://pan.ba ...

  6. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

  7. GJM : C#设计模式汇总整理——导航 【原创】

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  8. 整理下.net分布式系统架构的思路

    最近看到有部分招聘信息,要求应聘者说一下分布式系统架构的思路.今天早晨正好有些时间,我也把我们实际在.net方面网站架构的演化路线整理一下,只是我自己的一些想法,欢迎大家批评指正. 首先说明的是.ne ...

  9. 安卓GreenDao框架一些进阶用法整理

    大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一.查询指令整理 1.链式执行的指令 return mDaoSession. ...

随机推荐

  1. socketv 验证客户端链接的合法性

    一 .socketv 验证客户端链接的合法性 send()与sendall() 验证客户端 加密验证 如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用hmac+加 ...

  2. ie6 PNG图片透明

    _background:none; _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=images/videoTips.pn ...

  3. hdu 2119(简单二分图) Matrix

    http://acm.hdu.edu.cn/showproblem.php?pid=2119 一个由0和1构成的矩阵,每次选取一行或者一列将其中的1变成0,求最小删除次数 简单的二分图应用,矩阵的横坐 ...

  4. spring boot (一): Hello World

    什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...

  5. POJ3621或洛谷2868 [USACO07DEC]观光奶牛Sightseeing Cows

    一道\(0/1\)分数规划+负环 POJ原题链接 洛谷原题链接 显然是\(0/1\)分数规划问题. 二分答案,设二分值为\(mid\). 然后对二分进行判断,我们建立新图,没有点权,设当前有向边为\( ...

  6. codeforces round#510

    蒟蒻和以前一样还是只能做 $4$ 题, 希望有一天可以 水到 $5$ 题!! 不过也终于上了蓝了...   A. Benches Description 给出$N$个座位, 每个座位上初始有$a_i$ ...

  7. 数组转xml格式/xml格式转数组

    数组转xml格式 $arr=array( 'username'=>'huahua', 'password'=>'123456', 'number'=>'15889652911', ) ...

  8. [Robot Framework] SikuliLibrary的关键字执行依赖java进程,但是上次的java进程如果没有杀掉,robot framework控制台的日志出不来,怎么办?

    如果在suite的setup里面杀掉java进程:AutoItLibrary.Run | taskkill /F /IM java.exe 执行sikuli的关键字会报这样的错误: Connectio ...

  9. Python中的实例方法、类方法、静态方法和普通方法

    为了辨析它们的差别,写了如下代码: class C: def self_method(self, a): return a @classmethod def class_method(cls, a): ...

  10. javascript对象的属性,方法,prototype作用范围分析.

    用了javascript这么久由于没有系统学习过基础,总是拿来主义. 所以对一些基础知识还是搞不清楚很混乱. 今天自己做个小例子,希望彻底能搞清楚. 注释中对象只例子的对象本身,原型只原型继承对象的新 ...