2016年4月25日_JAVA学习笔记_Lock和Condition

1、在毕老师的视频里,首先介绍的是synchronized关键字作为同步,紧接着在多生产者和多消费者的例子当中就引出了Lock接口和Condition接口。而在书中是先介绍的Lock核Condition接口。我感觉Lock和Con接口比较复杂,相比于synchronized关键字来说需要做的事情太多,很繁琐,虽然功能可能强大很多,但是对于初学者来说先接触一个简单的关键字,从而学习到同步的概念是比较好的。

2、书中有一个简单的Lock接口例子

 1 private Lock myLock = new ReentrantLock();//创建一个Lock接口对象,不需要自己真的去实现这个接口,有现成的可以用
 2
 3 public void method()
 4 {
 5     myLock.lock();//获取一个锁
 6     try    //必须检查异常
 7     {
 8         System.out.println();//线程的功能代码
 9     }
10     finally
11     {
12         myLock.unlock();//释放锁,写在finally当中以确保抛出异常时锁也能被正确的释放
13     }
14 }

在这个例子当中可以看到如何使用Lock接口。我觉得相比synchronized关键字来说比较不爽的一点就是必须要写try...finally语句,这让整个程序变得比较臃肿。

3、关于Condition接口,毕老师的视频里说的比较通俗易懂。这个接口是一个监视器接口,在之前使用syn关键字时一个锁只能拥有一个监视器,就是这个锁本身。但是现在可以通过Condition接口来创建任意多的监视器接口,每一个监视器接口相互独立(一定意义上),下面是例子。

import java.util.concurrent.locks.*; 

class resrouce    //资源对象
{
    private String name;    //生产的物品
    private int count = 1;    //生产的编号
    private boolean flag = false;    //判断是否需要生产

    private Lock aLock = new ReentrantLock();//创建一个锁的对象,Lock是接口名称,R...Lock是一个实现了Lock的内部类
    private Condition set_con = aLock.newCondition();//创建生产资源线程的监视器
    private Condition out_con = aLock.newCondition();//创建消费资源线程的监视器
    public void set(String aName)    //资源类当中的生产资源方法
    {
        aLock.lock();    //获取一个锁,锁名为aLock
        try
        {
            while(flag)    //判断产品还在不在,如果还在就等待,不在就生产
            {
                try{set_con.await();}//使用生产者监视器的等待方法,区别于Object的wait()
                catch(InterruptedException e){}
            }
            name = aName + count++;
            System.out.println(Thread.currentThread().getName()+"...生产者"+this.name);
            flag = true;//表示生产完毕
            out_con.signal();//生产完毕后唤醒生产者的线程,而不是唤醒消费者的线程
        }
        finally
        {
            aLock.unlock();    //释放一个锁,这个操作必须在final中使用,以防抛出异常后未释放锁
        }
    }

    public void out()
    {
        aLock.lock();
        try
        {
            while(!flag)
            {
                try{out_con.await();}    //使用消费者监视器的等待方法
                catch(InterruptedException e){}
            }
            System.out.println(Thread.currentThread().getName()+"...消费者...."+this.name);
            flag = false;
            set_con.signal();
        }
        finally
        {
            aLock.unlock();
        }
    }
}
时间: 2024-10-12 17:44:19

2016年4月25日_JAVA学习笔记_Lock和Condition的相关文章

2016年4月27日_JAVA学习笔记_JAVA中常见的API(一)String

1.String在JAVA中是一个单独的类,只不过是一种特殊的,专门用来表示字符串的类.之前接触到的创建方式很简单,就是跟C语言中创建变量一样, String aString = "This is a String."; //变量类型为String,变量名为aString,内容为"This is a String.". 在学习API时,接触到了一种特别的创建方式.因为String是一个类,那么就肯定可以用其构造器方法来创建相应的对象. String aString

2016年3月30日_JAVA学习笔记

1.今天早上起的还算早,8点半起的,明天争取更早吧. 2.今天把毕老师的视频面向对象的部分看完了,现在开心重新看JAVA核心技术-卷一,直接从第四章对象与类开始看起. 3.书中提到类之间有三种最常见的关系,依赖,聚合,继承. 依赖大概能理解,就是一个类使用了另外一个类的方法或者对象,继承就是父类与子类的关系.但是聚合一直搞不清楚,等有机会再弄清楚吧. 4.画了好大的篇幅来专门讲一个格林尼治时间类,搞不懂为什么,等有需要的时候再来学习吧. 5.跟毕老师的视频里提到的一样,对于类中创建的成员变量,不

2016年3月27日_JAVA学习笔记

1.前一天晚上开通了博客,今天是第一天写博客,或者说是日记吧. 右手的骨折还没完全康复,也还不知道要多久.现在仍然是左手用鼠标,而且无名指明显也不会打字了.毕竟已经3个月没有怎么用过了,所以完全恢复应该还需要一段时间吧. 2.JAVA中存在有嵌套类的情况,所谓嵌套类就是在一个类中还存在着一个类,这个类以成员变量的形式存在.在毕老师的视频中介绍了几种内部类的调用方法. //外部.内部.方法为非静态, //外部.内部 n = new 外部().new 内部(); //n.show(); //外部和方

2016年4月16日_JAVA学习笔记_第六章克隆

1.克隆也就是创建一个变量的拷贝,两者相互独立. person p = new person(); person p1 = p; //仅仅是重新创建另外一个变量,引用的是同一个东西 person p_clone = p.clone();//创建上一个变量的克隆,两者没有关系 2.

2016年4月20日_JAVA学习笔记_多线程

1.感觉书里的东西没什么意思了,继续来看毕老师的视频好了.今天家里就剩我一个人了,可以出去吃饭了. 2.程序中每一个任务称为一个线程,同时可以控制多个任务的程序称为多线程程序.与多进程(进程也就是WIN任务管理器中的)的区别在于,进程之间是独立的,不共享数据,而线程是共享数据的,同时线程更加简单,轻量,最后一个进程中可以有多个线程. 3.在多个线程运行的过程中,线程间的切换是由CPU控制的,这个切换是随机的.JVM的运行时就包含了多个线程.

2016年4月24日_JAVA学习笔记_多线程三_线程间通信

1.毕老师第十四天内容,线程间的通信.大概是使用wait(),notify()等一系列函数来控制各个线程的CPU执行资格和执行权,通过合适的时机在各个线程当中切换来达到线程间通信的目的. 涉及到的方法: wait():让线程处于等待状态,被wait()的线程会被存储到线程池当中,直到被唤醒.只能在同步方法中被调用. notify():随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态.只能在同步方法和同步代码块中被调用. notifyAll():接触所有在该对象上调用wait()方法的

2016年4月2日_JAVA学习笔记_下午

1.一个重要的知识点:子类不能直接访问超类中的私有成员. 2.如果子类的构造器没有显式的调用超类的构造器,则将自动的调用超类默认的构造器(无参数).如果超类没有无参数构造器,并且子类构造器又没有调用超类的其他有参数构造器,那么将编译失败. 3.一个对象变量可以指示(引用)多种实际类型的现象被称为多态.在运行时能够自动选择调用哪个方法的现象称为动态绑定(调用的是实际引用对象的方法). 4.在一个包中直接运行对应的.class文件是不可行的.只能在包所在路径运行 java myBao.myClass

2016年4月2日_JAVA学习笔记_上午

1.昨天晚上忘记发布就直接关机了,算了.本就没写多少. 2.包这个小节还有类路径看书看的我一头雾水. 3.昨天看毕老师视频时讲到了类的四个权限等级,从封装性最好到最开放依次是,private,默认,protected,public. private:仅允许当前类进行访问: 默认:允许当前类和当前包进行访问: protected:允许当前类和当前包,以及其他包中的子类: public:允许所有人进行访问 4.在shell命令运行java时,需要注意类路径,如果当前目录下没有找到,会在classpa

2016年4月22日_JAVA学习笔记_多线程2

1.线程的六个状态(不同的地方有不同的状态数量和名称,但是应该都是大同小异): 新创建(New):可运行(Runnable):被阻塞(blocked):等待(Waiting):计时等待(Timed waiting):被终止(Terminated). 1)当使用new 操作符创建一个新线程时,该线程还没有开始运行,在运行之前还有一些基础工作需要做(可能),因此处于新创建状态: 2)一旦线程调用了start方法,线程就处于可运行状态中.但是需要注意的是,一个可运行的线程可能正在运行也可能没有运行,这