Java
文章平均质量分 70
Rogera7
先后从事Android手机、Android TV开发
展开
-
马士兵高并发编程笔记一之关键字概念
脏读对写业务加锁,对读业务不加锁。在写的过程中去读取,容易产生脏读问题。重入锁一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,再次申请的时候仍然会得到该对象的锁,也就是说synchronized获得的锁是可重入的。 synchronized方法调用synchronized方法,前提是他们持有同一个对象的锁。只要锁定的是同一个对象。同一个类中synch...原创 2018-04-07 23:43:39 · 379 阅读 · 0 评论 -
Java并发之并发容器
先来一张图丫丫金: 一、Map1、不需要同步的情况HashMap TreeMap LinkedHashMap2、并发不高的情况Hashtable Collections.synchronizedMap(Map3、高并发的情况ConcurrentHashMap (分成16段,然后给各段加锁,多线程访问小分段,所以效率高些) Concur...原创 2018-04-30 01:47:30 · 663 阅读 · 0 评论 -
Java并发之线程池
线程池是为了避免频繁地创建和销毁线程而设计的,可以让创建的线程复用。1、常用线程池 ThreadPollExecutor表示一个线程池,Executors扮演着线程池工厂的角色,通过Executos可以取得一个特定功能的线程池。// 返回固定线程数量的线程池public static ExecutorService newFixedThreadPool(int nThrea...原创 2018-04-29 22:53:06 · 171 阅读 · 0 评论 -
Java并发之信号量、倒计数门闩、循环栅栏和LockSupport
1、信号量(Semaphore)信号量(Semaphore)是对锁的扩展,内部锁synchronized和重入锁ReentrantLock一次都只允许一个线程访问一个资源,而信号量却可以指定多个线程同时访问某个资源。// 指定准入数,即能同时申请多少个许可public Semaphore(int permits) // fair指定是否公平public Semaphore(int...原创 2018-04-25 00:41:50 · 1470 阅读 · 0 评论 -
Java并发之线程的常用操作
1、终止线程1. Thread.stop() Thread 类的 stop()方法,已废弃。原因:在结束线程时,会直接终止线程,并且会立即释放这个线程所持有的锁。如果写线程写入数据写到一半,强行终止,可能造成对象被写坏。 2. 使用退出标记 3. Thread.interrupt()2、线程中断线程中断并不会使线程立即退出,指示给线程发一个通知,告诉线程有人希望你退出。...原创 2018-04-24 21:51:43 · 258 阅读 · 0 评论 -
Java虚拟机之String Pool
String Pool 是一块用来专门存放String的堆内存。String类是一个特殊类,创建的对象是不可变的。创建方式可以使用 new 关键字创建,也可以使用双引号 ” ” 创建。 String Pool 有助于为Java Runtime节省大量空间,但需要更多时间来创建字符串以及查找。 1、使用 ” ” 创建String对象1、直接使用 ” ” 申明String s1 ...原创 2018-05-01 23:20:31 · 499 阅读 · 0 评论 -
Java虚拟机之垃圾收集过程
1、Java技术和JVM1、JVM体系结构 HotSpot JVM拥有支持强大功能和功能基础的体系结构,并支持实现高性能和大规模可伸缩性的能力。 例如,HotSpot JVM JIT编译器会生成动态优化。 JVM主要的组件包括 classloader、运行时数据区和执行引擎。2、调优关键组件 下图紫色高亮部分显示了与性能相关的JVM的关键组件。 在调整性能时,JVM有三...翻译 2018-05-01 17:38:59 · 360 阅读 · 0 评论 -
Java虚拟机之堆 VS 栈
1、堆Java堆是用来在运行时给Java对象(Objects)和JRE 类分配内存空间的。 垃圾收集器就是收集堆中没有被引用到的对象。对应用程序来讲,堆是全局的,它可以在应用的任何地方被引用到。2、栈java栈内存用于一个线程执行。他们包含了方法中局部变量的值和堆中对象的引用。栈内存是后进先出(LIFO)顺序的。当一个方法被调用时,就为它分配一块栈空间用于保存方法中的局部变量值和...翻译 2018-05-01 14:26:24 · 202 阅读 · 0 评论 -
Java并发之锁的优化
在高并发的环境下,激烈的锁竞争会导致程序性能下降。1、减小锁持有的时间在锁的竞争过程中,如果某个线程获得了锁,那其他线程就只有等了,如果该线程持有的时间长,那就会影响系统性能。public void synchronized function(){ otherCode1(); mutexCode(); //需要同步的代码 otherCode2();}...原创 2018-04-30 11:41:14 · 167 阅读 · 0 评论 -
线程安全的单例模式的常用四种创建方式
单例模式是常用的一种设计模式,线程安全的单例模式一般有三种写法,其中双重检查模式是最复杂的,也是不推荐的。 那有没有更好的推荐方式呢?答案是肯定的。请继续往下看。1. 不使用同步锁饱汉式public class Singleton { //直接初始化 private static Singleton instance = new Singleton();...原创 2018-04-15 17:09:24 · 584 阅读 · 0 评论 -
马士兵高并发编程笔记四之生产者/消费者
写一个固定容量同步容器,拥有put和get方法,以及getCount方法,能够支持2个生产者线程以及10个消费者线程的阻塞调用有如下两种方法实现:1. 使用 wait 和 notify / notifyAllpublic class MyContainer1<T> { final private LinkedList<T> lists = new...原创 2018-04-07 23:44:08 · 632 阅读 · 1 评论 -
Java并发之ReentrantLock
ReentrantLock 可以替代synchrozied,可以完成同样的功能, 更灵活 手动上锁,手动释放锁主要有以下几个特点:必须手动释放锁可以指定时间,要是时间段内没有申请到,就可以自己做相应处理中断响应,锁定之后,别人可以打断还可以把锁指定为公平锁,谁等的时间长,谁就会优先得到锁Condition条件方法整理:lock():获取锁,如果已被占用,则等待lo...原创 2018-04-07 23:44:00 · 242 阅读 · 0 评论 -
马士兵高并发编程笔记二之容器读写同步
容器读写同步,实时通知实现一个容器,提供两个方法,add,size, 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束1. volatile方法public class MyContainer2 { //添加volatile,使t2能够得到通知 volatile List lists = new Arra...原创 2018-04-07 23:43:51 · 508 阅读 · 3 评论 -
ThreadLocal 的原理分析
对于 LocalThread 的原理分析,我们从 Android 的Looper类开始分析,我们知道 Looper.myLooper() 会返回当前 Thread 的 Looper。我们就来看看 myLooper() 方法为什么可以返回当前线程的 Looper,而不是其他线程的 Looper。Looper的主要相关代码如下:public final class Looper { /...原创 2018-08-04 17:08:26 · 501 阅读 · 0 评论