java 多线程 串行 加锁_java多线程 synchronized 与lock锁 实现线程安全
如果有多個線程在同時運行,而這些線程可能會同時運行這段代碼。程序每次運行結(jié)果和單線程運行的結(jié)果是一樣
的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的。
通過賣火車票的例子
火車站要賣票,我們模擬賣票過程。假設(shè)座位共100個,我們來模擬售票窗口,實現(xiàn)多個窗口同時賣票需要窗口,采用線程對象來模擬;需要票,Runnable接口子類來模擬
未加鎖前:
public class RunnableImpl implements Runnable {
//定義總票數(shù)
private int ticket=100;
@Override
public void run() {
while (true) {
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在賣出" + ticket + "張票");
//票數(shù)減少
ticket--;
}
}
}
}
出現(xiàn)線程安全問題
線程安全問題都是由全局變量及靜態(tài)變量引起的。若每個線程中對全局變量、靜態(tài)變量只有讀操作,而無寫
操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執(zhí)行寫操作,一般都需要考慮線程同步,
否則的話就可能影響線程安全
模擬票(通過synchronized線程同步):
synchronized(同步鎖){
需要同步操作的代碼
}
public class RunnableImpl implements Runnable {
//定義總票數(shù)
private int ticket=100;
//加鎖
Object Object= new Object();
@Override
public void run() {
while (true) {
synchronized (Object) {
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在賣出" + ticket + "張票");
//票數(shù)減少
ticket--;
}
}
}
}
}
售票測試類:
public class sellTicket {
public static void main( String[] args ) {
RunnableImpl runnable = new RunnableImpl();
Thread thread0 = new Thread(runnable);
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
//調(diào)用start方法
thread0.start();
thread1.start();
thread2.start();
}
}
線程安全
使用lock鎖的方式實現(xiàn)線程安全:d
java.util.concurrent.locks.Lock 機制提供了比synchronized代碼塊和synchronized方法更廣泛的鎖定操作,
同步代碼塊/同步方法具有的功能Lock都有,除此之外更強大,更體現(xiàn)面向?qū)ο蟆?/p>
Lock鎖也稱同步鎖,加鎖與釋放鎖方法化了,如下:
public void lock():加同步鎖。
public void unlock():釋放同步鎖。
使用如下:
//定義總票數(shù)
private int ticket = 100;
//使用鎖
Lock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
//加鎖
lock.lock();
if (ticket > 0) {
try {
Thread.sleep(10);
System.out.println(Thread.currentThread().getName() + "正在賣出" + ticket + "張票");
//票數(shù)減少
ticket--;
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
}
}
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java 多线程 串行 加锁_java多线程 synchronized 与lock锁 实现线程安全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java k均值_算法——K均值聚類算法
- 下一篇: java异常体系_Java 异常体系