- 浏览: 62783 次
- 性别:
- 来自: 成都
最新评论
文章列表
读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 ...
首先导入两个包:
<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 ...
首先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 ...