Java实现线程同步的方式

2017-08-02  本文已影响0人  梦袋熊先生

1、使用 synchronized 关键字实现线程之间的互斥操作。

public synchronized void set(int data) {...}      
public synchronized void get() {...}  

2、使用Lock接口实现线程之间的互斥操作,注意使用这种方式需要手动释放锁,否则会造成死锁现象。

private ReadWriteLock rwl = new ReentrantReadWriteLock();   
    public void set(int data) {  
        rwl.writeLock().lock();// 取到写锁  
        try {  
            System.out.println(Thread.currentThread().getName() + "准备写入数据");  
            try {  
                Thread.sleep(20);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            this.data = data;  
            System.out.println(Thread.currentThread().getName() + "写入" + this.data);  
        } finally {  
            rwl.writeLock().unlock();// 释放写锁  
        }  
    }   
    public void get() {  
        rwl.readLock().lock();// 取到读锁  
        try {  
            System.out.println(Thread.currentThread().getName() + "准备读取数据");  
            try {  
                Thread.sleep(20);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            System.out.println(Thread.currentThread().getName() + "读取" + this.data);  
        } finally {  
            rwl.readLock().unlock();// 释放读锁  
        }  
    }  

使用lock则将读写操作分离开,很好的避免了读操作也互斥造成速度过慢的问题。

3、wait/notify/notifyAll

    private String lock;

    public Subtract(String lock) {
        super();
        this.lock = lock;
    }
...
    public void subtract() {
        try {
            synchronized (lock) {
                if(ValueObject.list.size() == 0) {//将这里的if改成while即可保证不出现越界异常!!!!
                    System.out.println("wait begin ThreadName="
                            + Thread.currentThread().getName());
                    lock.wait();
                    System.out.println("wait   end ThreadName="
                            + Thread.currentThread().getName());
                }
                ValueObject.list.remove(0);
                System.out.println("list size=" + ValueObject.list.size());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
...

Summary
自己对线程进行的一些总结,其中有些代码来源于网上其他童鞋的资料,如有侵权请联系我,谢谢

上一篇 下一篇

猜你喜欢

热点阅读