java 多线程三

java 多线程一

java 多线程二

java 多线程三

java 多线程四

 

注意到 java 多线程一MyThread2 运行结果出现0、-1,那是因为在操作共享数据时没有加锁导致。

加锁的方式:

1、同步方法

2、同步代码块

3、锁

读过 java.util.concurrent 集合源码就知道:

HashMap:
public V put(K key, V value) {...}

Hashtable:
public synchronized V put(K key, V value) {...}

ConcurrentHashMap:
final V putVal(K key, V value, boolean onlyIfAbsent) {
                  ...
                synchronized (f) {  ...}
}      

CopyOnWriteArrayList:
public void add(int index, E element) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
        ...
        } finally {
            lock.unlock();
        }
 }    

 我们最好只同步修改数据的部分,其他的尽量不要去同步(特别是耗时的,比如sleep()..io..)

class MyThread2 implements Runnable {
    int tickets = 5;

    public void run() {
        for (; tickets > 0; ) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (this){
                if (tickets>0){
                    System.out.println(Thread.currentThread().getName() + ":" + tickets--);
                }
            }

        }
    }
}

 输出:

MyThread2_1:5
MyThread2_2:4
MyThread2_3:3
MyThread2_1:2
MyThread2_2:1

 

posted @ 2017-09-30 21:21  懒企鹅  阅读(220)  评论(0编辑  收藏  举报