尚学堂【官网】-西安Java培训|c++培训|Android培训|安卓培训|java视频教程|软件工程师|-西安雁塔尚学堂计算机学校
Java教程  尚学堂首页Java学院Java教程

尚学堂:浅谈java并发问题(二)

www.xasxt.com 发布人:java  |  来自:本站  |  发布时间:2015-05-29 10:31:18  |  点击次数:1563

       我们接着之前的内容,继续为大家讲解java中的并发问题。除了上文提到的java中的synchronized对资源加锁以外,还有一个方法可以解决并发问题。

       用关键字Lock可以解决,具体用法如下。

class BoundedBuffer {
    final Lock lock = new ReentrantLock();
    final Condition notFull  = lock.newCondition();
    final Condition notEmpty = lock.newCondition();

    final Object[] items = new Object[100];
    int putptr, takeptr, count;

    public void put(Object x) throws InterruptedException {
        lock.lock();
        try {
            while (count == items.length)
                notFull.await();
            items[putptr] = x;
            if (++putptr == items.length) putptr = 0;
            ++count;
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }

    public Object take() throws InterruptedException {
        lock.lock();
        try {
            while (count == 0)
                notEmpty.await();
            Object x = items[takeptr];
            if (++takeptr == items.length) takeptr = 0;
            --count;
            notFull.signal();
            return x;
        } finally {
            lock.unlock();
        }
    }
}

       要注意以下几点:

       1.这是一个实现阻塞列队的例子,阻塞列队就是一个列队如果满了或是空了,都会导致线程阻塞等待。java里的 ArrayBlockingQueue提供了现成的阻塞队列,就不需要自己再写一个了。

       2.与synchronized相比,使用Lock的的优点是,Lock是对wait的线程进行了分类,不像synchronize里的wait和notify,其中一个问题解决了,另一个问题还没有解决的时候,只能wait,浪费时间与资源。

ArrayBlockingQueue的具体实现如下:

BlockingQueue<Object> blockingQ = new ArrayBlockingQueue<Object> 10;
//一个线程从队列里取
for(;;){
    Object o = blockingQ.take();//队列为空,则等待(阻塞)
}
//另一个线程往队列存
for(;;){
    blockingQ.put(new Object());//队列满,则等待(阻塞)
}

       解决并发问题的解决方式有很多,除了以上讲解的这些,Executors、Executor、ExecutorService、ThreadPoolExecutor这些都可以使用线程管理任务。使用多线程的好处就是充分利用了CPU的处理能力,提高速度。java中所说的利用面向对象的思想解决问题,有些时候,如果不采用多线程,就没有办法实现,所以,学会如何解决并发的问题,也是每个程序员所必须要掌握的。

当前文:尚学堂:浅谈java并发问题(二)
上一页:如何学习java好找工作?
下一页:尚学堂:浅谈java并发问题(一)
在线报名(*为必填项)