A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Spring up 中级黑马   /  2012-12-13 15:47  /  1069 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一个线程是不安全的,如何用collections类的方法对其进行加锁,然后得到安全的线程?

2 个回复

倒序浏览
JDK1.5之后将同步和锁封装成了对象
Lock接口:出现替代了同步代码块或者同步函数。将同步的隐式锁操作变成了显示锁操作。
        同时更为灵活,可以一个锁上加上多组监视器。
lock():获取锁
unlock():释放锁,通常需要定义在finally代码块中。

Condition接口:出现替代了object中的wait  notify  notifyAll方法。
        将这些监视器方法单独进行了封装,变成Condition监视器对象。
        可以和任意的锁进行组合。
回复 使用道具 举报
给你个例子,14天视频里面有的

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Resource3{
        private String name;
        private int count = 1;
        private boolean flag = false;
        //创建一个锁对象。
        Lock lock = new ReentrantLock();
        //通过已有的锁获取该锁上的监视器对象。
//        Condition c = lock.newCondition();
        //通过已有的锁获取两组监视器,一组监视生产者,一组监视消费者。
        Condition producer_con = lock.newCondition();
        Condition consumer_con = lock.newCondition();       
       
       
        public void set(String name){               
                lock.lock();
                try{
                        while(flag)
                                try{producer_con.await();}
                                catch(InterruptedException e){}
                        this.name = name + count;
                        count++;
                        System.out.println(Thread.currentThread().getName()+"...生产者"+this.name);               
                        flag = true;
                        consumer_con.signal();
                }
                finally{
                        lock.unlock();
                }
        }
        public void get(){
                lock.lock();
                try{
                        while(!flag)
                                try{consumer_con.await();}
                                catch(InterruptedException e){}
                        System.out.println(Thread.currentThread().getName()+"...消费者..."+this.name);
                        flag = false;
                        producer_con.signal();
                }
                finally{
                        lock.unlock();
                }
        }
}

class Producer2 implements Runnable{
        Resource3 r;
        Producer2(Resource3 r){
                this.r = r;
        }       
        public void run(){
                while(true){
                        r.set("烤鸭");
                }
        }
}

class Consumer2 implements Runnable{       
        Resource3 r;
        Consumer2(Resource3 r){
                this.r = r;
        }
        public void run(){
                while(true){
                        r.get();
                }
        }
}

public class NewJDKDemo3 {
        public static void main(String[] args) {
                Resource3 r = new Resource3();
               
                Producer2 pro = new Producer2(r);
                Consumer2 con = new Consumer2(r);
               
                Thread t0 = new Thread(pro);
                Thread t1 = new Thread(pro);
                Thread t2 = new Thread(con);
                Thread t3 = new Thread(con);
               
                t0.start();
                t1.start();
                t2.start();
                t3.start();               
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马