蘇州培訓(xùn)網(wǎng) > 蘇州JAVA培訓(xùn)機(jī)構(gòu) > 蘇州其然軟件開發(fā)培訓(xùn)
首頁(yè) 培訓(xùn)網(wǎng) 最新資訊 熱門問答

蘇州其然軟件開發(fā)培訓(xùn)

免費(fèi)試聽

您當(dāng)前的位置: 蘇州IT認(rèn)證培訓(xùn) > 蘇州JAVA培訓(xùn) > 蘇州參加java培訓(xùn)

蘇州參加java培訓(xùn)_JAVA培訓(xùn)

¥詳詢

班制:周末班

蘇州其然軟件開發(fā)
上課(咨詢)地址:蘇州市昆山市震川西路111號(hào)名仕大廈
報(bào)名咨詢 預(yù)約試聽
課程介紹
蘇州參加java培訓(xùn)
教學(xué)的至高境界 分級(jí)教學(xué)

蘇州參加java培訓(xùn)

Java開發(fā)的應(yīng)該 如何掌握上述相關(guān)技術(shù)?

蘇州參加java培訓(xùn)

Java開發(fā)的應(yīng)該如何掌握上述相關(guān)技術(shù)?

一:首先,有這樣的一種情況很常見,對(duì)于想自學(xué)Java開發(fā)的人來(lái)說(shuō),他們 大多數(shù)都是非常盲目的,不知道自己改如何入手,很多人在網(wǎng)上找一些視頻,然后瘋狂的過視頻,很快就把一塊內(nèi)容都學(xué)完,他們理解的學(xué)完了就是視 頻看完了,但是讓他們動(dòng)手去做東西卻做不出來(lái),而我的理解學(xué)完了就是自己能寫出東西,所以對(duì)于初學(xué)者來(lái)說(shuō)一定不能盲目,要有自己的規(guī)劃,不然 就是浪費(fèi)時(shí)間白忙活。

二:既然是學(xué)習(xí)Java開發(fā)專業(yè)技術(shù),我個(gè)人的建議是,一定要有一個(gè)能指導(dǎo) 你的人,不能都靠自己閉門造車,這樣的行為并不聰明,結(jié)識(shí)一位這方面的人才,時(shí)不時(shí)去問問人家問題,不然你可能會(huì)發(fā)現(xiàn)一個(gè)小問題能困擾你一天 ,**后還不知道是什么原因。

三:學(xué)習(xí)Java開發(fā)技術(shù),不能跟學(xué)數(shù)學(xué)語(yǔ)文一樣對(duì)待,比較剛接觸代碼是不 容易記住的,所以要掌握上述的技術(shù),你還要知道學(xué)習(xí)Java開發(fā)技術(shù)有哪些“坑”。對(duì)于學(xué)習(xí)方法這塊是尤為重要的,怎么學(xué)才能讓你學(xué)完了能記住之 前學(xué)的那些,不至于學(xué)完了就忘,這個(gè)問題值得你學(xué)習(xí)之前去思考的。

四:根據(jù)我多年的學(xué)習(xí)情況來(lái)看,你平時(shí)一定要養(yǎng)成好的學(xué)習(xí)習(xí)慣,就說(shuō)我 自己吧!我就喜歡把自己曾經(jīng)遇到的問題整理在電腦的日記本上,然后我會(huì)搜集一下博客相關(guān)的Java技術(shù)文章,一些我認(rèn)為比較有用的網(wǎng)站,以后都能 用的上,這是我個(gè)人的學(xué)習(xí)習(xí)慣,相信我,如果你想走的更遠(yuǎn),一定要養(yǎng)成習(xí)慣。

**后給大家一些詳細(xì)的學(xué)習(xí)安排路線:

Java基礎(chǔ):Java基礎(chǔ)語(yǔ)法、數(shù)組、類與對(duì)象、繼承與多態(tài)、異常、范型、集 合、流與文件、反射、枚舉、自動(dòng)裝箱和注解。

數(shù)據(jù)庫(kù):mysql、oracle

Javaweb:HTML與CSS網(wǎng)頁(yè)開發(fā)基礎(chǔ)、Java腳本語(yǔ)言、搭建開發(fā)環(huán)境、JSP基 本語(yǔ)法、JSP內(nèi)置對(duì)象、JavaBean技術(shù)、Servlet技術(shù)、Ajax技術(shù)

框架:Struts2、Hibernate、Spring、SpringMVC、mybatis

大數(shù)據(jù)核心知識(shí)

蘇州參加java培訓(xùn)

大數(shù)據(jù)核心知識(shí)

Hadoop基礎(chǔ)

Hadoop1介紹

hadoop1架構(gòu)

hadoop2架構(gòu)(對(duì)比hadoop1)

hadoop2環(huán)境搭建

HDFS操作

yarn操作

Hadoop應(yīng)用

Hive數(shù)據(jù)倉(cāng)庫(kù)

zookeeper系統(tǒng)服務(wù)

HBase非關(guān)系型數(shù)據(jù)庫(kù)

Sqoop數(shù)據(jù)庫(kù)抽取工具

Flume日志抽取工具

Spark基礎(chǔ)

環(huán)境搭建

Spark平臺(tái)介紹

RDD彈性分布式數(shù)據(jù)集

Scala編程

Spark應(yīng)用

Spark-SQL組件

DataFrame組件

課程優(yōu)勢(shì)

1.真實(shí)的企業(yè)項(xiàng)目;

2.目前企業(yè)中應(yīng)用廣泛的技術(shù)路線;

3.部分Spark源碼剖析,從源碼層面提升問題解決能力。

4.從hadoop1到hadoop2機(jī)制原理詳細(xì)解說(shuō);

5.生產(chǎn)環(huán)境hadoop集群調(diào)優(yōu)經(jīng)驗(yàn);

6.企業(yè)真實(shí)項(xiàng)目實(shí)戰(zhàn);

本階段學(xué)習(xí)目標(biāo)

1.了解hadoop機(jī)制原理 ;

2.了解hadoop集群搭建過程;

3.了解Hdfs API使用以及mr編程模型;

4.了解hive、hbase、sqoop、flume等組件的使用方法;

5.Spark平臺(tái)的優(yōu)勢(shì)以及Spark集群的搭建過程;

6.Scala程序設(shè)計(jì)基礎(chǔ);

7.Spark-SQL和DataFrame API詳解。

本階段學(xué)習(xí)效果

1.了解hadoop集群的搭建過程;

2.能夠**mr和hive來(lái)實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)清洗的業(yè)務(wù)需求;

3.能夠了解數(shù)據(jù)的抽取,轉(zhuǎn)換,清洗,建模,入庫(kù)過程;

4.掌握Spark集群的搭建;

5.掌握函數(shù)式編程思想,能夠根據(jù)業(yè)務(wù)需求編寫高質(zhì)量的Scala程序;

6.掌握大規(guī)模離線數(shù)據(jù)的計(jì)算、分析能力。

java并發(fā)編程入門:synchronized 與 Lock 的那點(diǎn)事


>

此篇

synchronized和Lock應(yīng)用舉例轉(zhuǎn)自:http://www.cnblogs.com/benshan/p/3551987.html

**近在做一個(gè)監(jiān)控系統(tǒng),該系統(tǒng)主要包括對(duì)數(shù)據(jù)實(shí)時(shí)分析和存儲(chǔ)兩個(gè)部分,由于并發(fā)量比較高,所以不可避免的使用到了一些并發(fā)的知識(shí)。為了實(shí)現(xiàn)這些要求,后臺(tái)使用一個(gè)隊(duì)列作為緩存,對(duì)于請(qǐng)求只管往緩存里寫數(shù)據(jù)。同時(shí)啟動(dòng)一個(gè)線程監(jiān)聽該隊(duì)列,檢測(cè)到數(shù)據(jù),立即請(qǐng)求調(diào)度線程,對(duì)數(shù)據(jù)進(jìn)行處理。 具體的使用方案就是使用同步保證數(shù)據(jù)的正常,使用線程池提高效率。

同步的實(shí)現(xiàn)當(dāng)然是采用鎖了,java中使用鎖的兩個(gè)基本工具是 synchronized 和 Lock。

一直很喜歡synchronized,因?yàn)槭褂盟芊奖恪1热?,需要?duì)一個(gè)方法進(jìn)行同步,那么只需在方法的簽名添加一個(gè)synchronized關(guān)鍵字。

// 未同步的方法 public void test() {} // 同步的方法 pubilc synchronized void test() {}

synchronized 也可以用在一個(gè)代碼塊上,看

public void test() { synchronized(obj) { System.out.PRintln(“===”); } }

synchronized 用在方法和代碼塊上有什么區(qū)別呢?

synchronized 用在方法簽名上(以test為例),當(dāng)某個(gè)線程調(diào)用此方法時(shí),會(huì)獲取該實(shí)例的對(duì)象鎖,方法未結(jié)束之前,其他線程只能去等待。當(dāng)這個(gè)方法執(zhí)行完時(shí),才會(huì)釋放對(duì)象鎖。其他線程才有機(jī)會(huì)去搶占這把鎖,去執(zhí)行方法test,但是發(fā)生這一切的基礎(chǔ)應(yīng)當(dāng)是所有線程使用的同一個(gè)對(duì)象實(shí)例,才能實(shí)現(xiàn)互斥的現(xiàn)象。否則synchronized關(guān)鍵字將失去意義。

(但是如果該方法為類方法,即其修飾符為static,那么synchronized 意味著某個(gè)調(diào)用此方法的線程當(dāng)前會(huì)擁有該類的鎖,只要該線程持續(xù)在當(dāng)前方法內(nèi)運(yùn)行,其他線程依然無(wú)法獲得方法的使用權(quán)?。?

synchronized 用在代碼塊的使用方式:synchronized(obj){//todo code here}

當(dāng)線程運(yùn)行到該代碼塊內(nèi),就會(huì)擁有obj對(duì)象的對(duì)象鎖,如果多個(gè)線程共享同一個(gè)Object對(duì)象,那么此時(shí)就會(huì)形成互斥!特別的,當(dāng)obj == this時(shí),表示當(dāng)前調(diào)用該方法的實(shí)例對(duì)象。即

public void test() { … synchronized(this) { // todo your code } … }

此時(shí),其效果等同于 public synchronized void test() { // todo your code }

使用synchronized代碼塊,可以只對(duì)需要同步的代碼進(jìn)行同步,這樣可以大大的提高效率。

小結(jié): 使用synchronized 代碼塊相比方法有兩點(diǎn)優(yōu)勢(shì): 1、可以只對(duì)需要同步的使用 2、與wait()/notify()/nitifyAll()一起使用時(shí),比較方便


wait() 與notify()/notifyAll()

這三個(gè)方法都是Object的方法,并不是線程的方法! wait():釋放占有的對(duì)象鎖,線程進(jìn)入等待池,釋放cpu,而其他正在等待的線程即可搶占此鎖,獲得鎖的線程即可運(yùn)行程序。而sleep()不同的是,線程調(diào)用此方法后,會(huì)休眠一段時(shí)間,休眠期間,會(huì)暫時(shí)釋放cpu,但并不釋放對(duì)象鎖。也就是說(shuō),在休眠期間,其他線程依然無(wú)法進(jìn)入此代碼內(nèi)部。休眠結(jié)束,線程重新獲得cpu,執(zhí)行代碼。wait()和sleep()**大的不同在于wait()會(huì)釋放對(duì)象鎖,而sleep()不會(huì)!

notify(): 該方法會(huì)喚醒因?yàn)檎{(diào)用對(duì)象的wait()而等待的線程,其實(shí)就是對(duì)對(duì)象鎖的喚醒,從而使得wait()的線程可以有機(jī)會(huì)獲取對(duì)象鎖。調(diào)用notify()后,并不會(huì)立即釋放鎖,而是繼續(xù)執(zhí)行當(dāng)前代碼,直到synchronized中的代碼全部執(zhí)行完畢,才會(huì)釋放對(duì)象鎖。JVM則會(huì)在等待的線程中調(diào)度一個(gè)線程去獲得對(duì)象鎖,執(zhí)行代碼。需要注意的是,wait()和notify()必須在synchronized代碼塊中調(diào)用。

notifyAll()則是喚醒所有等待的線程。

為了說(shuō)明這一點(diǎn),舉例如下: 兩個(gè)線程依次打印”A”“B”,總共打印10次。

public class Consumer implements Runnable {

@Override public synchronized void run() { // TODO Auto-generated method stub int count = 10; while(count > 0) { synchronized (Test. obj) { System. out.print( "B"); count --; Test. obj.notify(); // 主動(dòng)釋放對(duì)象鎖 try { Test. obj.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

}

public class Produce implements Runnable {

@Override public void run() { // TODO Auto-generated method stub int count = 10; while(count > 0) { synchronized (Test. obj) { //System.out.print("count = " count); System. out.print( "A"); count --; Test. obj.notify(); try { Test. obj.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

}

測(cè)試類如下:

public class Test {

public static final Object obj = new Object(); public static void main(String[] args) { new Thread( new Produce()).start(); new Thread( new Consumer()).start(); }

}

這里使用static obj作為鎖的對(duì)象,當(dāng)線程Produce啟動(dòng)時(shí)(假如Produce首先獲得鎖,則Consumer會(huì)等待),打印“A”后,會(huì)先主動(dòng)釋放鎖,然后阻塞自己。Consumer獲得對(duì)象鎖,打印“B”,然后釋放鎖,阻塞自己,那么Produce又會(huì)獲得鎖,然后…一直循環(huán)下去,直到count = 0.這樣,使用Synchronized和wait()以及notify()就可以達(dá)到線程同步的目的。


除了wait()和notify()協(xié)作完成線程同步之外,使用Lock也可以完成同樣的目的。

ReentrantLock 與synchronized有相同的并發(fā)性和內(nèi)存語(yǔ)義,還包含了中斷鎖等候和定時(shí)鎖等候,意味著線程A如果先獲得了對(duì)象obj的鎖,那么線程B可以在等待指定時(shí)間內(nèi)依然無(wú)法獲取鎖,那么就會(huì)自動(dòng)放棄該鎖。

但是由于synchronized是在JVM層面實(shí)現(xiàn)的,因此系統(tǒng)可以監(jiān)控鎖的釋放與否,而ReentrantLock使用代碼實(shí)現(xiàn)的,系統(tǒng)無(wú)法自動(dòng)釋放鎖,需要在代碼中finally子句中顯式釋放鎖lock.unlock();

同樣的例子,使用lock 如何實(shí)現(xiàn)呢?

public class Consumer implements Runnable {

private Lock lock; public Consumer(Lock lock) { this. lock = lock; } @Override public void run() { // TODO Auto-generated method stub int count = 10; while( count > 0 ) { try { lock.lock(); count --; System. out.print( "B"); } finally { lock.unlock(); //主動(dòng)釋放鎖 try { Thread. sleep(91L); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

}

public class Producer implements Runnable{

private Lock lock; public Producer(Lock lock) { this. lock = lock; } @Override public void run() { // TODO Auto-generated method stub int count = 10; while (count > 0) { try { lock.lock(); count --; System. out.print( "A"); } finally { lock.unlock(); try { Thread. sleep(90L); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

}

調(diào)用代碼:

public class Test {

public static void main(String[] args) { Lock lock = new ReentrantLock(); Consumer consumer = new Consumer(lock); Producer producer = new Producer(lock); new Thread(consumer).start(); new Thread( producer).start(); }

}

使用建議:

在并發(fā)量比較小的情況下,使用synchronized是個(gè)不錯(cuò)的選擇,但是在并發(fā)量比較高的情況下,其性能下降很嚴(yán)重,此時(shí)ReentrantLock是個(gè)不錯(cuò)的方案。

——————————-<全文完>——————————————————————————————————-


相關(guān)推薦:


蘇州JAVA培訓(xùn)   蘇州JAVA培訓(xùn)班   蘇州JAVA培訓(xùn)機(jī)構(gòu)

體驗(yàn)課預(yù)約試聽

倒計(jì)時(shí)

12:00:00

課程熱線:

在線咨詢

客服在線時(shí)間:早上9點(diǎn)~下午6點(diǎn),其他時(shí)間請(qǐng)?jiān)诰€預(yù)約報(bào)名或留言,謝謝!

蘇州JAVA

免費(fèi)體驗(yàn)課開班倒計(jì)時(shí)

11: 41: 09

稍后會(huì)有專業(yè)老師給您回電,請(qǐng)保持電話暢通

咨詢電話:
推薦機(jī)構(gòu) 全國(guó)分站 更多課程

本周僅剩 個(gè)試聽名額

請(qǐng)鍵入信息,稍后系統(tǒng)將會(huì)把領(lǐng)獎(jiǎng)短信發(fā)至您的手機(jī)

申請(qǐng)?jiān)嚶犆~

QQ:
加盟合作:0755-83654572