多线程之synchronized
java的堆中信息是共享的,線程是把會(huì)堆中信息拷貝,對副本進(jìn)行操作,操作完再同步堆中的信息,而堆中的信息可能被b線程修改了,a線程的副本還是未修改前的,此時(shí)就引發(fā)多并發(fā)問題。解決多并發(fā)的問題就是通過枷鎖,使原先多個(gè)線程并行執(zhí)行程序轉(zhuǎn)為多個(gè)線程串行執(zhí)行程序。
一個(gè)對象不管多少方法用synchronized修飾,都只擁有一把鎖.
相關(guān)概念:
監(jiān)視器
監(jiān)視器可以看做是經(jīng)過特殊布置的建筑,這個(gè)建筑有一個(gè)特殊的房間,該房間通常包含一些數(shù)據(jù)和代碼,但是一次只能一個(gè)消費(fèi)者(thread)使用此房間,
當(dāng)一個(gè)消費(fèi)者(線程)使用了這個(gè)房間,首先他必須到一個(gè)大廳(Entry Set)等待,調(diào)度程序?qū)⒒谀承?biāo)準(zhǔn)(e.g. FIFO)將從大廳中選擇一個(gè)消費(fèi)者(線程),進(jìn)入特殊房間,如果這個(gè)線程因?yàn)槟承┰虮弧皰炱稹?#xff0c;它將被調(diào)度程序安排到“等待房間”,并且一段時(shí)間之后會(huì)被重新分配到特殊房間,按照上面的線路,這個(gè)建筑物包含三個(gè)房間,分別是“特殊房間”、“大廳”以及“等待房間”。
簡單來說,監(jiān)視器用來監(jiān)視線程進(jìn)入這個(gè)特別房間,他確保同一時(shí)間只能有一個(gè)線程可以訪問特殊房間中的數(shù)據(jù)和代碼。
synchronized是一個(gè)重量級(jí)和重入鎖,當(dāng)一個(gè)線程持有鎖時(shí),這個(gè)線程再次獲取相同的鎖,是不用等待,可以直接獲取,synchronized鎖住的代碼塊,只有由持有鎖的線程才能訪問。
相關(guān)api簡介:
Thread
Thread(Runnable target) 構(gòu)造一個(gè)新線程,線程啟動(dòng)會(huì)調(diào)用target的run方法.
Object
notify()
喚醒在監(jiān)視器里面的一個(gè)等待線程
wait()
? 讓當(dāng)前線程等待
例;
請編寫2個(gè)線程,線程1順序輸出1,3,5,……, 99 等奇數(shù),每個(gè)數(shù) 一 。
線程2順序輸出2,4,6……100等偶數(shù),每個(gè)數(shù) 一 。
最終的結(jié)果要求是輸出為 自然順序:1,2,3,4,……99,100。
public class TestLock2 implements Runnable {private int num;private int initNum;public TestLock2(int num, int initNum) {this.num = num;this.initNum = initNum;}@Overridepublic void run() {synchronized (this) {while (initNum < num) {this.notify();System.out.println(Thread.currentThread().getName() + ":" + initNum);initNum++;try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {//打印一百個(gè)數(shù),兩個(gè)線程個(gè)循環(huán)50次,兩個(gè)都是用testLock2這個(gè)實(shí)例構(gòu)造,testLock2里面的全局變量是共享的TestLock2 testLock2 = new TestLock2(51, 1);Thread thread1 = new Thread(testLock2);thread1.setName("線程1");Thread thread2 = new Thread(testLock2);thread2.setName("線程2");thread1.start();try {thread1.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}thread2.start();}}
?
轉(zhuǎn)載于:https://www.cnblogs.com/thomas-seven/p/9002791.html
總結(jié)
以上是生活随笔為你收集整理的多线程之synchronized的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle问题
- 下一篇: mysql 自定义提示符