java线程三部分_java 多线程三
注意到 java 多線程一 中 MyThread2 運行結(jié)果出現(xiàn)0、-1,那是因為在操作共享數(shù)據(jù)時沒有加鎖導(dǎo)致。
加鎖的方式:
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();
}
}
我們最好只同步修改數(shù)據(jù)的部分,其他的盡量不要去同步(特別是耗時的,比如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
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的java线程三部分_java 多线程三的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux的实际操作:文件目录类的实用指
- 下一篇: java io大文件_JavaIO流对大