`
文章列表
读ReentrantLock的unlock()源码: //这个方法:委托到sync的release实现。 public void unlock() { sync.release(1); } public final boolean release(int arg) { //释放锁成功 if (tryRelease(arg)) { Node h = head; if (h != null && h.waitStatus != 0) ...
//ReetrantLock源码解析: Lock lock = new ReentrantLock(); try { lock.lock(); ....doSomething } finally { lock.unlock(); } //先从我们最常用的这个lock()方法开始.从非公平模式来看lock的实现, public void lock() { sync.lock(); //委托到sync对象实现. } //sync的实现 abstract s ...
...
...
...

kafka与spring的整合

首先导入两个包: <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.10.0.0</version> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId&g ...

kafka的简单实用

首先maven导入kafka的包: <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.10.0.0</version> </dependency> 先来Producter生产者: public static void main(String[] args) { //kafka的配置 Properties p ...
以下面代码为例: ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:application.xml"); User user = (User) applicationContext.getBean("user"); user.getName(); 很显然spring会读取classpath下的配置文件,然后解析配置文件中的各个标签: 当遇到<context:component-scan base-package=&q ...
简单介绍一下java Executors框架来管理线程池原理: //创建一个线程数大小为3的线程池 Executors.newFixedThreadPool(3); 1、线程池中的线程如何创建?创建后保存在哪里? public class ThreadPoolExecutor extends AbstractExecutorService { //用队列保存需要执行的任务 private final BlockingQueue<Runnable> workQueue; //将Worker保存在HashSet中,Worker是什么? ...
一个简单的学习多线程缓存的demo: //计算 public interface Computable<A, V> { V compute(A arg) throws InterruptedException; } /** 第一种最简单实现:采用HashMap,直接在compute()方法上加锁这种构建缓存的方式有很大问题, * 如果compute执 ...
CyclicBarrier主要用于等待一组线程都执行到某个时刻。 它和CountDownLatch的区别:CountDownLatch用在等待某个事件,而CountDownLatch用于等待线程。 CountDownLatch用于一个或者多个线程等待其他一组线程。 CyclicBarrier用于一组线程之间的相互等待。 下面是一个例子: public class CycleBarrierTest implements Runnable { private CyclicBarrier cyclicBarrier; public CycleBarrierTest(CyclicBarr ...
CountDownLatch类中维护了一个计数器,当计数器为0时,释放所有线程。这个类可以用于当所有的资源都初始化后进行操作。 CountDownLatch中的await方法等待计数器达到0,表示所有的线程已经执行完毕。如果计数器不为0,await()方法会一直阻塞等待计数器变为0。而countDown()方法用于递减计数器。 下面是一个计算执行时间的例子: import java.util.concurrent.CountDownLatch; public class CountDownLatchTest { public static Long getMillion ...
第一种实现: //这种实现有一个问题,produce和consume用的是同一把锁。所以生产的时候就不能消费,消费的时候不能生产. public class Storage implements StorageInterface{ private final int MAX_NUM = 100; private LinkedList<Object> lists = new LinkedLi ...
用mybatis的时候有一个问题困扰着我就是mybatis的mapper都是接口,没有实现类为什么可以直接调用xml中的sql语句进行实现?带着疑问我去看mybatis源码: 以在spring中整合mybatis为例:首先在web容易启动的时候,加载在spring中配置的SqlSessionFactoryBean和MapperScannerConfigurer。 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <pro ...
1、不实现modelDriven接口,那么params拦截器会通过ognl去取栈顶的对象,然后进行封装。 2、实现了modelDriven接口. public String intercept(ActionInvocation invocation) throws Exception { Object action = invocation.getAction(); if (action instanceof ModelDriven) { ModelDriven modelDriven = (ModelDriven) ac ...
Global site tag (gtag.js) - Google Analytics