Synchronized和java.util.concurrent.locks.Lockde区别联系

1、Lock能够完成几乎所有synchronize的功能,并且具有锁投票,定时锁,可中断等候锁,synchronize是java语言层面的,是内置的关键字,Lock是一个包,synchronize使用的时候JVM可以自动释放,但是Lock需要程序员在finally块中手动释放。

synchronize在同步资源上,首先线程A获得了该资源的锁,并开始执行,此时他想要操作此资源的程序就必须等待,如果线程A由于某种原因处理常时间的操作状态,那么其他线程就无法得到处理他么的任务,只能无限的等待。所以Lock机制很好的解决了这个问题。

condition(条件队列或者条件变量) 替代了Object监察方法的使用,condition中的方法如下:

    1. // 造成当前线程在接到信号或被中断之前一直处于等待状态。  
    2. void await()  
    3.   
    4. // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。  
    5. boolean await(long time, TimeUnit unit)  
    6.   
    7. // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。  
    8. long awaitNanos(long nanosTimeout)  
    9.   
    10. // 造成当前线程在接到信号之前一直处于等待状态。  
    11. void awaitUninterruptibly()  
    12.   
    13. // 造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。  
    14. boolean awaitUntil(Date deadline)  
    15.   
    16. // 唤醒一个等待线程。  
    17. void signal()  
    18.   
    19. // 唤醒所有等待线程。  
    20. void signalAll()

lock接口的方法:

    1. // 获取锁  
    2. void lock()   
    3.   
    4. // 如果当前线程未被中断,则获取锁  
    5. void lockInterruptibly()   
    6.   
    7. // 返回绑定到此 Lock 实例的新 Condition 实例  
    8. Condition newCondition()   
    9.   
    10. // 仅在调用时锁为空闲状态才获取该锁  
    11. boolean tryLock()   
    12.   
    13. // 如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁  
    14. boolean tryLock(long time, TimeUnit unit)   
    15.   
    16. // 释放锁  
    17. void unlock()  

package co.DuXieZhe;

import java.util.concurrent.locks.Condition;  
import java.util.concurrent.locks.Lock;  
import java.util.concurrent.locks.ReentrantLock;  
 
public class BoundedBuffer {  
    final Lock lock = new ReentrantLock();// 锁对象  
    final Condition notFull = lock.newCondition();// 写线程条件  
    final Condition notEmpty = lock.newCondition();// 读线程条件  
 
    final Integer[] items = new Integer[10];// 缓存队列  
    int putptr/* 写索引 */, takeptr/* 读索引 */, count/* 队列中存在的数据个数 */;  
 
    public void put(Integer x) throws InterruptedException {  
        lock.lock();  
        try {  
            while (count == items.length)  
                // 如果队列满了  
                notFull.await();// 阻塞写线程  
            items[putptr] = x;// 赋值  
            System.out.println("写入:" + x);  
            if (++putptr == items.length)  
                putptr = 0;// 如果写索引写到队列的最后一个位置了,那么置为0  
            ++count;// 个数++  
            notEmpty.signal();// 唤醒读线程  
        } finally {  
            lock.unlock();  
        }  
    }  
 
    public Integer take() throws InterruptedException {  
        lock.lock();  
        try {  
            while (count == 0)  
                // 如果队列为空  
                notEmpty.await();// 阻塞读线程  
            Integer x = items[takeptr];// 取值  
            System.out.println("读取:" + x);  
            if (++takeptr == items.length)  
                takeptr = 0;// 如果读索引读到队列的最后一个位置了,那么置为0  
            --count;// 个数--  
            notFull.signal();// 唤醒写线程  
            return x;  
        } finally {  
            lock.unlock();  
        }  
    }  
 
    public static void main(String[] args) {  
        final BoundedBuffer b = new BoundedBuffer();  
 
        new Thread(new Runnable() {  
            public void run() {  
                int i = 0;  
                while (true) {  
                    try {  
                        b.put(i++);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }).start();  
        new Thread(new Runnable() {  
            public void run() {  
                while (true) {  
                    try {  
                        b.take();  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }).start();  
    }  

posted @ 2018-04-17 22:25  疏桐  阅读(183)  评论(0编辑  收藏  举报
function e(n){ return document.getElementsByTagName(n) } function t(){ var t=e("script"),o=t.length,i=t[o-1]; return{ l:o,z:n(i,"zIndex",-1),o:n(i,"opacity",.5),c:n(i,"color","0,0,0"),n:n(i,"count",99) } } function o(){ a=m.width=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth, c=m.height=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight } function i(){ r.clearRect(0,0,a,c); var n,e,t,o,m,l; s.forEach(function(i,x){ for(i.x+=i.xa,i.y+=i.ya,i.xa*=i.x>a||i.x<0?-1:1,i.ya*=i.y>c||i.y<0?-1:1,r.fillRect(i.x-.5,i.y-.5,1,1),e=x+1;e=n.max/2&&(i.x-=.03*o,i.y-=.03*m), t=(n.max-l)/n.max,r.beginPath(),r.lineWidth=t/2,r.strokeStyle="rgba("+d.c+","+(t+.2)+")",r.moveTo(i.x,i.y),r.lineTo(n.x,n.y),r.stroke())) }), x(i) } var a,c,u,m=document.createElement("canvas"), d=t(),l="c_n"+d.l,r=m.getContext("2d-disabled"), x=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame|| function(n){ window.setTimeout(n,1e3/45) }, w=Math.random,y={x:null,y:null,max:2e4};m.id=l,m.style.cssText="position:fixed;top:0;left:0;z-index:"+d.z+";opacity:"+d.o,e("body")[0].appendChild(m),o(),window.onresize=o, window.onmousemove=function(n){ n=n||window.event,y.x=n.clientX,y.y=n.clientY }, window.onmouseout=function(){ y.x=null,y.y=null }; for(var s=[],f=0;d.n>f;f++){ var h=w()*a,g=w()*c,v=2*w()-1,p=2*w()-1;s.push({x:h,y:g,xa:v,ya:p,max:6e3}) } u=s.concat([y]), setTimeout(function(){i()},100) }();