- 博客(13)
- 收藏
- 关注
原创 ConcurrentHashMap
由于HashMap 在执行并发put操作时候会引起死循环(多次添加,会覆盖掉原来的vaue值不影响),使用HashTable,在put ()和get() 上都存在线程阻塞,因此效率低下。ConcurrentHashMap的锁分段技术能够有效提升并发访问量。 在 ConcurrentHashMap 中,不允许用 null 作为键和值。 ConcurrentHashMap 使用分段锁技术,将数据分成...
2018-03-31 22:12:07 152
原创 HashMap
HashMap低层实现原理HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(哈希冲突的解决方案有多种:开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法,而HashMap即是采用了链地址法),如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定...
2018-03-31 21:03:28 899 3
原创 Condition 接口
任意一个java对象,都拥有一组监视器方法(Object),主要包括wait()、notify()以及notifyall(),这些方法配合synchronized同步关键字,可以实现通知等待模式。Condition接口也提供类似Object的监视器方法,与lock 配合实现等待/通知模式。condition对象是由lock对象创建出来,依赖于Lock对象,一般会将condition变量作为成员变量...
2018-03-31 14:58:16 172
原创 java 重入锁和读写锁
重入锁 顾名思义,就是支持重进入的锁,他表示该锁能够支持一个线程对资源的重复加锁,并且支持获取锁的公平和非公平性选择。synchronized 关键字隐私支持重进入,ReentrantLock在调用lock 方法时候,已经获取到锁的线程能够再次调用lock()方法时而不被阻塞。 公平的获取锁,也就是等待时间最长的线程最优先获取锁,也可以说获取是顺序的。ReentrantLock提供一...
2018-03-30 10:57:07 340
原创 自定义同步组件——TwinsLock
设计一个同步工具,该工具同一个时刻,只允许两个线程同时访问,超过两个线程访问将会被阻塞。 分析:首先,确定访问模式,TwinLock能够同一时刻支持多个线程同时访问,这明显是共享式访问。这需要同步器提供的acquireShared(int args)方法和Share相关的方法,同时要求重写tryAcquireShared(int args)等方法。 其次,定义资源数量,TwinsLock在同一...
2018-03-29 14:54:16 614
原创 Java 中的锁之Lock接口
锁是控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁是允许多个并发线程的访问,如读写锁),在Lock接口出现之前,Java程序靠synchronized关键字实现锁功能的。Java SE5之后,并发包里增加了Lock 接口(以及相关实现类)用来实现锁功能,提供类似的同步功能,缺少synchronized 隐身释放锁的便捷性,但是拥有锁的获取与释放的可操作...
2018-03-28 14:58:05 465
原创 static
C++中static关键字的的使用函数体内 static 变量的作用范围为该函数体,不同于 auto 变量, 该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问在模块内的static 函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内在类的static 成员变量属...
2018-03-27 17:21:06 139
原创 Java 并发编程基础之线程应用实例
线程应用实例等待超时模型: 在等待/通知范式基础上增加了超时控制,这使得该模式相比原有范式更具有灵活性。总体思路如下 构造数据连接池,模拟出获取,使用,释放连接等方法,由于获取释放等方法将改变数据连接池中资源的数量,为实现线程安全,用synchronized修饰数据池对象。注意,这里的超时获取,与对象锁的超时获取有异曲同工之妙,原理基本一致。 在测试中,用CountDo...
2018-03-27 13:42:21 145
原创 数组调整-奇数位于偶数前
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路分析:这道题要求把奇数放到数组前半部分,偶数放到数组后半部分,,因此所以奇数应该位于偶数前面,因此可以维护两个下标,第一个指向数组第一个位子,只向后移动;第二个指向数组最后一个位置,只向前移动。如果第一个指针指向的数字是偶数...
2018-03-25 22:31:05 152
原创 Java 并发编程基础之线程通信
在进行进程通信之前,我们先了解下Daemon线程(即守护线程):一种支持型线程,主要作为程序中后台调度以及支持性工作。这就意味着1)用户线程(如MAIN线程等)不会是守护线程2)JVM中没有非Daemon线程时,Daemon立即终止,并且finally块也不执行。通常通过thread.setDaemon(true) 将一个线程设置为守护进程。课题一:启动和终止进程 1)构造线程:线程对象在构造的时...
2018-03-25 20:25:14 140
原创 java秒杀系统实现
秒杀系统高并发优化:系统流程 秒杀未开始【详情页】(各种商品信息)包含-系统时间-倒计时;进入秒杀环节【地址暴露接口】(拿到秒杀地址)-【执行秒杀操作】-【放回结果】具体优化操作:详情页:用户大量刷新,可以将detail 页静态化,静态资源css,js等部署到CDN(内容分发网络,可以是动态也可以是静态资源,加速用户获取数据的系统,部署在用户最近的网络节点,命中CDN不需要访问后端服务器) ,这些...
2018-03-24 16:59:39 3587
原创 Java 并发机制之Synchronized
在多线程并发编程中synchronized的一直是元老级别角色,通过对象的内置锁实现互斥访问共同变量,通常被称为重量级锁,但是为了减少获得锁和释放锁带来的性能消耗,在jdk 1.6中引入了偏向锁和轻量级锁。在以下博文中,我们先讨论其实现底层原理以及他的锁升级过程。java 中每一个对象可作为锁,具体有三种表现形式:1)对于普通同步方法,锁是当前实例对象 2)对于静态同步方法,锁是当前类的class...
2018-03-24 14:22:04 232
原创 Java 并发机制之volatile
在多线程并发编程中,volatile 是轻量级synchronized,被关键字volatile修饰的域变量被称为共享变量,因此在开发过程中是可见的,即一个线程修改一个共享变量时候,另外一个线程能读到这个修改的值。因此在线程同步中具有以下几个特性:1)为域变量提供一个免锁机制2)该域能够被其他线程更新3)每次使用需要从内存中重新获取4)不是原子操作,不能被final 修饰vola...
2018-03-24 13:18:50 253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人