定義用戶去銀行存錢,每次存100,存3次 餓漢式 懶漢式 多線程 在同一時間,做多件事情. 創建線程的方法 繼承類Thread並重寫run(),run()稱為線程體;用這種方法定義的類不能再繼承其他類。 class FirstThread extends Thread{ public void ru ...
定義用戶去銀行存錢,每次存100,存3次
class Bank {
// 總數
private int sum;
// 定義方法
public void add(int num){
// 傳入參數
sum = sum + sum;
// 加後的值
System.out.println("sum"+sum);
}
}
class Demo implements Runnable{
// 定義銀行類對象,創建實例對象
private Bank b = new Bank();
// 線程run()
public void run(){
for(int x=0; x<3; x++){
// 將參數放入對象方法中
b.add(100)
}
}
}
// 測試類
class Test{
public static void main(String[] args){h
// 創建對象
Demo d=new Demo();
// 創建線程對象
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
// 線程開啟
t1.start();
t2.start();
}
}
如果出現這個代碼,出現了多線程安全問題。共性數據即共用對象中的數據。
class Bank {
// 總數
private int sum;
// 創建對象
private Object obj = new Object();
// 定義方法
public void add(int num){
synchronized(obj){
// 傳入參數
sum = sum + sum;
// 加後的值
System.out.println("sum"+sum);
}
}
}
安全問題,加了同步可以解決數據安全。
class Tickets implements Runnable{
private int tickets = 100;
private Object obj = new Object();
public void run(){
whilt(true){
synchronized(obj){
if(tickets>0){
try{
Thread.sleep(1000);
}catch(Exception e){
System.out.println(Thread.currentThread().getName()+tickets);
}
}
}
}
}
}
餓漢式
class Single{
private static final Single s = new Single();
private Single(){)
public static Single getInstance(){
return s;
}
}
懶漢式
class Single{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if(s==null){
s = new Single();
}
return s;
}
}
多線程
在同一時間,做多件事情.
創建線程的方法
繼承類Thread並重寫run(),run()稱為線程體;用這種方法定義的類不能再繼承其他類。
class FirstThread extends Thread{
public void run(){
for(int i=0;i<100;i++){
System.out.println("FirstThread"+i);
}
}
}
class Test{
public static void main(Sting args[]){
FirstThread ft = new FirstThread();
ft.start();
for(int i = 0; i<100;i++){
System.out.println("main"+i):
}
}
}
介面Runnable的類作為線程的目標對象
class Test implements Runnable{
public void run(){
for(int i = 0;i<100;i++){
System.out.println("Runnable"+i);
}
}
}
class Test{
public static void main(String args[]){
Test test = new Test();
Thread t = new Thread(test);
System.out.println(t.getPriority());
t.start();
}
}
喚醒線程
線程類
主方法類
線程同步與等待
線程的同步
關鍵字synchronized
多線程就是調用這個synchronized的方法的,
當線程用了這個方法,那麼其他線程想使用這個方法時就得等,直到線程使用完該調用的方法。
同步中的等待
wait()方法:暫時讓出cpu;
notifyAll()方法:等待結束。
線程是程式中的執行線程,在Java虛擬機中允許應用程式併發地運行多個執行線程,每個線程獨有它自己的一個優先順序,高的優先順序的執行線程優先於低優先順序的線程,每個線程都可以有或者不可以標記的一個守護程式。當一個線程中的運行代碼創建一個Thread對象的時候,該線程的初始化優先順序就被設定,只有創建線程是守護線程的時候,這個線程才是守護程式。
在Java中的虛擬機啟動,通常會有單個非守護線程,一般在代碼中有個線程為主線程,main方法。
第36節:Java當中的線程
第35節:Java面向對象中的多線程
這兩篇文章講了什麼是進程,什麼是線程等一些概念。
進程要執行需要依賴線程,線程是進程中最小的執行單位,一個進程中至少要有一個線程,線上程中串列是單條線程來執行多個任務來說的,任務A到任務B到任務C,只有任務A完成了後才開始到任務B,一條線完成。並行為開啟多個線程同時進行任務,同一時刻發生任務A,任務B,任務C。
什麼是線程安全
線程出現問題是在多線程的情況之下產生的。出現線程安全問題,如何去解決這個問題呢?用synchronized關鍵字,用來控制線程同步的,可以讓線程在多線程的情況下,不被多個線程同時執行,保證我們數據的安全性。
public synchronized void add(int i){
...
}
Lock的引入讓鎖有了可操作性,它是在Java1.6被引入進來的,Lock可以去手動獲取鎖和釋放鎖。
// ReentrantLock是Lock的子類
private Lock lock = new ReentrantLock();
private void methodThread(Thread thread){
// 獲取鎖對象
lock.lock();
try {
System.out.println(thread.getName() + "獲得了鎖");
}catch(Exception e){
e.printStackTrace();
} finally {
System.out.println(thread.getName() + "釋放了鎖");
// 釋放鎖對象
lock.unlock();
}
}
往後餘生,努力學習
簡書作者:達叔小生
90後帥氣小伙,愛編程,愛運營,愛折騰。
簡書博客: https://www.jianshu.com/u/c785ece603d1
結語
- 下麵我將繼續對其他知識 深入講解 ,有興趣可以繼續關註
- 小禮物走一走 or 點贊