|
| 1 | +# JavaSample |
| 2 | +[](https://github.com/GokuMohandas/practicalAI/blob/master/LICENSE) |
| 3 | +[](http://hits.dwyl.com/Robinwho/JavaSample) |
| 4 | +[](https://travis-ci.org/Wechat-Group/WxJava) |
| 5 | + |
| 6 | +# 简介 |
| 7 | +- 🔥 New:此项目将Java常用设计模式、数据结构、分布式、算法、JVM、缓存技术等核心基础针对性做了实现。并均可直接运行。 |
| 8 | + |
| 9 | +# 使用说明 |
| 10 | + |
| 11 | +- git或下载项目: |
| 12 | +>$ git clone https://github.com/Robinwho/JavaSample.git |
| 13 | +
|
| 14 | +本地打开运行即可。 |
| 15 | + |
| 16 | +# 模块列表 |
| 17 | +## 分布式 |
| 18 | +### LRU1 |
| 19 | +- 用java自己实现一个LRU。 |
| 20 | + |
| 21 | +### LRUCache |
| 22 | +- 通过 HashMap 实现一个缓存类 LRUCache ,我们通过逻辑处理,对最少使用的数据进行删除。 |
| 23 | + |
| 24 | +### LRUNode |
| 25 | +- 保证基本的Cache容量,如果超过容量则必须丢掉最不常用的缓存数据,再添加最新的缓存。每次读取缓存都会改变缓存的使用时间,将 |
| 26 | +缓存的存在时间重新刷新。通过双向链表的数据结构实现 LRU Cache,链表头(head)保存最新获取和存储的数据值,链表尾(tail) |
| 27 | +既为最不常使用的值,当需要清理时,清理链表的 tail 即可,并将前一个元素设置为tail。 |
| 28 | + |
| 29 | +## 设计模式 |
| 30 | +### BeanFactory |
| 31 | +- 懒汉式的变种,spring IOC容器就是使用的这种注册式的单例模式 |
| 32 | + |
| 33 | +### Hungry |
| 34 | +- 单例模式:饿汉式。在类加载时,就创建单例对象,执行效率高,但是占空间,以空间换时间,线程安全。 |
| 35 | + |
| 36 | +### Lazy1 |
| 37 | +- 单例模式:懒汉式。双重判断,对象使用的时候,才去创建。有线程安全的风险,需要加锁。 |
| 38 | + |
| 39 | +### Lazy2 |
| 40 | +- 单例模式:懒汉式。静态内部类,在使用时,才加载。此种模式,既是懒加载,又没有加锁影响性能。 |
| 41 | + |
| 42 | +## 线程模型 |
| 43 | +>用三个线程按顺序循环打印abc三个字母,比如abcabcabc。 |
| 44 | +使用同步块和wait、notify的方法控制三个线程的执行次序。具体方法如下:从大的方向上来讲,该问题为三线程间的同步唤醒操作, |
| 45 | +主要的目的就是ThreadA->ThreadB->ThreadC->ThreadA循环执行三个线程。为了控制线程执行的顺序,那么就必须要确定唤醒、等待的顺序, |
| 46 | +所以每一个线程必须同时持有两个对象锁,才能进行打印操作。一个对象锁是prev,就是前一个线程所对应的对象锁,其主要作用是保证当前 |
| 47 | +线程一定是在前一个线程操作完成后(即前一个线程释放了其对应的对象锁)才开始执行。还有一个锁就是自身对象锁。主要的思想就是,为 |
| 48 | +了控制执行的顺序,必须要先持有prev锁(也就前一个线程要释放其自身对象锁),然后当前线程再申请自己对象锁,两者兼备时打印。之后 |
| 49 | +首先调用self.notify()唤醒下一个等待线程(注意notify不会立即释放对象锁,只有等到同步块代码执行完毕后才会释放),再调用 |
| 50 | +prev.wait()立即释放prev对象锁,当前线程进入休眠,等待其他线程的notify操作再次唤醒。 |
| 51 | + |
| 52 | +### ABC_Synch |
| 53 | +- synchronized 搭配wait/notify实现。 |
| 54 | + |
| 55 | +### ConcurrentSingleLinedList |
| 56 | +- 并发安全的链表。在链表实现的基础上加锁,所有设计到链表结构变化的地点加锁,例如,新增,删除等操作。例如:借助ReentrantLock() |
| 57 | +可重入锁对新增结点加锁,避免冲突。 |
| 58 | + |
| 59 | +### SyncThreadTest |
| 60 | +- 信号量Sephmore。开启多个线程,如果保证顺序执行,有哪几种实现方式,或者如何保证多个线程都执行完再拿到结果。 |
| 61 | + |
| 62 | +### SyncThreadTestReentrantLock |
| 63 | +- 使用ReentrantLock可重入锁。 |
| 64 | + |
| 65 | +### ThreadPrintType2 |
| 66 | +- lock锁方式 |
| 67 | + |
| 68 | +# 联系 |
| 69 | +- 🔥🔥🔥🔥🔥🔥🔥🔥 因工作繁忙,更新有延迟。公众号【未名小猪】更方便 |
| 70 | +- 🔥🔥🔥🔥🔥🔥🔥🔥 欢迎大家关注留言,工作生活随想,与大家交流 |
| 71 | + |
| 72 | + |
0 commit comments