并发编程
KogRow(接毕设和大作业版)
这个作者很懒,什么都没留下…
展开
-
阻塞队列实现的生产者/消费者模式
public class MyThread { static int i; public static void main(String[] args) { TickOffice t = new TickOffice(); Thread t1 = new Thread(new Produce(t)); t1.setName(原创 2017-03-12 20:20:25 · 315 阅读 · 0 评论 -
数据库连接池示例以及性能分析
直接上代码:连接池ConnectionPool:package com.shuaicenglou.ConnectionPool;import java.util.LinkedList;public class ConnectionPool { private LinkedList pool = new LinkedList<>(); public ConnectionPool(原创 2017-08-16 14:34:56 · 340 阅读 · 0 评论 -
简单的线程池示例
线程池类采用面向接口编程的方式,这种方式有一个好处就是可以作为Spring管理的一个bean使用,不需要自己new对象,将对象的创建交给容器,岂不是美滋滋,因此基于这个考虑,首先定义一个线程池的接口ThreadPool:package com.shuaicenglou.ThreadPool;public interface ThreadPool { /** * 获取线程池中的线程数原创 2017-08-16 17:02:32 · 1519 阅读 · 2 评论 -
自定义独占锁的实现
和ReentrantLock中的lock(),unlock具有一样的效果,都是以AQS为基础实现的/** * 自定义的独占锁 * @author shuaicenglou * */class Mutex implements Lock{ /** * AQS提供的模板方法: * acquire:独占式获取同步状态 * release:独占式释放同步状态 * AQS提供原创 2017-08-17 14:11:37 · 624 阅读 · 0 评论 -
个人对于轻量级锁、重量级锁的理解
此处说的轻量级锁、重量级锁都不是java语言上的锁,而是jvm为了提高锁的获取与释放的效率而做的优化的手段。Synchronized关键字用的锁是存放在Java对象头的MarkWord里面的,该MarkWord可以不太恰当地认为是一个标记当使用轻量级锁的时候:线程在执行同步块之前,JVM会在每个线程(即:将会访问同一个同步体的线程)的虚拟机栈中创建用于存储锁记录的空间,并将对象头中的M原创 2017-08-14 21:55:23 · 4335 阅读 · 15 评论 -
对于队列同步器AbstractQueuedSynchronizer的理解
AbstractQueuedSynchronizer,简称AQS,是一个抽象类,它采用了模板方法模式,降低了自定义同步组件实现的门槛。当需要实现自定义的同步组件时,只需要在自定义组件内部定义一个继承AQS的子类,重写自己需要的方法,再调用AQS提供的模板方法即可。AQS向锁的实现者屏蔽了底层的线程唤醒、阻塞、等待的细节,简化了锁的实现方式。AQS使用一个int成员变量表示同步状态,当该变量为0原创 2017-08-17 14:50:52 · 467 阅读 · 0 评论 -
多线程环境下操作HashMap的问题
HashMap为什么不是线程安全,并发操作Hashmap会带来什么问题:这个问题曾经有一个面试官问过我,当时我天真的以为是读写操作并发时存在脏数据的问题,当时面试官不置可否。我后面回来查资料,发现没有那么简单。并发操作HashMap,是有可能带来死循环以及数据丢失的问题的。具体情况如下:(以下代码转自美团点评技术团队的文章Java8系列之重新认识HashMap)情景如下代码:原创 2017-08-31 14:22:41 · 13174 阅读 · 7 评论 -
NIO与传统IO的区别
看到一篇2011年的文章讨论这个问题,写得很赞,转载之。原文地址:NIO与传统IO的区别以下是原文传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大。使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数量线程的线程池,甚至一个线程来为任意数量的连接服务。由于线程数量小于连接数量,所以转载 2018-01-19 20:23:47 · 213 阅读 · 0 评论