java中synchronized、Lock实现线程安全 #干货
线程安全:由并行变为串行地执行某代码块
是否同步 | 效率 | 使用场景 | |
---|---|---|---|
线程安全 | 是 | 低 | 并发访问共享资源 |
非线程安全(出现并发问题) | 否 | 高 | 吞吐量优先 |
用synchronized实现线程安全
package com.zjazn.toPage;
public class DuoXX implements Runnable{
int num=100;
public void run() {
while (true){
synchronized (this){//this是任何对象,就像一个厕所,什么东西能警示有没有人呢,可以是警示灯或一个牌子都可以任意的对象。
if(num>0){
System.out.println(Thread.currentThread().getName()+":卖出了第"+(num--)+"张票!");
}else {
break;
}
}
}
}
public static void main(String[] args) {
DuoXX duoXX = new DuoXX();
Thread zhuang = new Thread(duoXX,"小庄");
Thread hua = new Thread(duoXX,"小花");
zhuang.start();
hua.start();
}
}
用Lock使用线程安全
package com.zjazn.toPage;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class DuoXX implements Runnable{
private int num=100;
private Lock locke = new ReentrantLock();
public void run() {
while (true){
locke.lock();
if(num>0){
System.out.println(Thread.currentThread().getName()+":卖出了第"+(num--)+"张票!");
}else {
break;
}
locke.unlock();
}
}
public static void main(String[] args) {
DuoXX duoXX = new DuoXX();
Thread zhuang = new Thread(duoXX,"小庄");
Thread hua = new Thread(duoXX,"小花");
zhuang.start();
hua.start();
}
}