android設計模式-單例模式


轉:https://www.jianshu.com/p/9c32aea34b6d

單例模式是運用最廣泛的設計模式之一,在應用這個模式時,單例模式的類必須保證只有一個實例存在。多用于整個程序只需要有一個實例,通常很消耗資源的類,比如線程池,緩存,網絡請求,IO操作,訪問數據庫等。由于類比較耗資源,所以沒必要讓它構造多個實例,這種就是單例模式比較好的使用場景。確保一個類只有一個實例,并且自行實例化。向整個系統提供這個唯一的實例

幾個關鍵點:

1.構造函數用private,讓外部無法訪問,就沒辦法去重寫實例化

2.使用最關鍵的關鍵詞static,針對他的特性,內存中只有一份數據。

如:

public class SingletionStarving {private static final SingletionStarving mInstance = new SingletionStarving();private SingletionStarving() {}public static SingletionStarving getInstance() {return mInstance;}
}

實用的寫法:

public class SingletionDLC {private volatile static SingletionDLC mInstance;private SingletionDLC() {}public static SingletionDLC getmInstance() {if (mInstance == null) {synchronized (SingletionDLC.class) {if (mInstance == null) {mInstance = new SingletionDLC();}}}return mInstance;}
}

1、構造函數用private修飾,外部無法訪問
2、使用的時候即調用getInstance的時候才初始化
3、static關鍵字修飾,靜態變量,存儲在內存中,只有一份數據
4、synchronized線程安全,多線程情況下單例的唯一性
5、兩次判斷空,避免多次同步(synchronized)

synchronized的作用是保證在同一時刻, 被修飾的代碼塊或方法只會有一個線程執行,以達到保證并發安全的效果。

volatile 說白了就是被修飾的變量會被不同的線程訪問和修改,也是一個輕量級的同步機制

可見性:當某一個線程對共享變量的修改,其他線程可以立刻看到修改之后的值

防止編譯器優化:編譯器在優化代碼時會嘗試將變量的訪問操作優化為更高效的方式,例如將變量的值緩存在寄存器中。然而,對于某些特殊的變量,如多線程環境下的共享變量、中斷處理中的標志位、硬件寄存器等,這種優化可能會導致意外的行為。使用 volatile 關鍵字可以告訴編譯器不要對該變量進行優化,確保每次訪問都從內存中讀取或寫入。

處理多線程共享變量:在多線程編程中,當一個變量被多個線程共享并且可能被一個線程修改時,需要使用 volatile 關鍵字來確保線程之間的可見性。這樣可以防止編譯器對共享變量的優化,確保每個線程都能正確地讀取到最新的值。

處理中斷和硬件寄存器:在中斷處理程序中,某些變量可能由硬件直接修改,而不是通過常規的變量賦值操作。在這種情況下,使用 volatile 關鍵字可以確保編譯器不會對這些變量的訪問進行優化,以避免出現不一致的行為。

內部類的方式,也推薦使用

public class SingletionInternalClass {private SingletionInternalClass() {}public static SingletionInternalClass getInstance() {return SingletionInternalClassHolder.instance;}private static class SingletionInternalClassHolder {private static final SingletionInternalClass instance = new SingletionInternalClass();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11980.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11980.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何申請免費一年SSL證書

申請免費一年的SSL證書可以通過以下幾個步驟進行,這里以JoySSL為例,因為它是目前提供此類服務的流行平臺之一,同時也提到了寶塔面板中的TrustAsia SSL證書。請根據您的具體需求選擇合適的方式: 申請免費一年SSL證書: …

2024年為什么很多電商商家,都想涌入視頻號,究竟是什么原因?

大家好,我是電商糖果 對電商有了解的朋友,在今年肯定發現一個現象,那就是很多商家對視頻號比較青睞。 視頻號究竟有何魔力,讓越來越多的商家都想要入駐。 其實很簡單,它讓商家看到了市場。 視頻號背后是誰&#xf…

【Vue】Vue指令與生命周期以及組件化編碼

目錄 常用內置指令v-text與v-htmlv-text : 更新元素的 textContentv-html : 更新元素的 innerHTML注意:v-html有安全性問題!!!! v-once與v-prev-oncev-pre ref與v-cloakrefv-cloak 自定義指令案例定義語法配置對象中常…

兩數相加 - (LeetCode)

前言 今天無意間看到LeetCode的一道“兩數相加”的算法題,第一次接觸鏈表ListNode,ListNode結構如下: public class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val val;}ListNode(int val, ListNode next) {…

使用openssl生成自簽名證書

使用openssl生成自簽名證書 1. 交互式生成2. 一步生成參考 1. 交互式生成 自簽名 SSL 證書的生成涉及一個簡單的 3 步過程: 步驟 1:創建服務器私鑰 openssl genrsa -out cert.key 2048步驟 2:創建證書簽名請求 (CSR) openssl req -new -k…

Sectigo SSL證書申請的流程是怎樣的?

在當今數字化時代,網絡安全成為了一個不可忽視的問題。為了保護網站和用戶數據的安全,SSL證書成為了網站運營的重要組成部分。Sectigo作為全球領先的數字證書頒發機構之一,提供了一系列的證書解決方案來滿足不同類型網站的需求。以下是對Sect…

2024年算法建模與計算機通信國際學術會議(ICAMCC 2024)

2024年算法建模與計算機通信國際學術會議(ICAMCC 2024) 2024 International Conference on Algorithm Modeling and Computer Communication(ICAMCC 2024) 會議簡介: 2024年算法建模與計算機通信國際學術會議(ICAMCC 2024)將于中國南昌市盛大開幕。這次會議的目的是…

IP應用場景查詢API接口

IP應用場景查詢API接口指的是輸入IP地址,查詢IP應用場景信息。那么IP地址應用場景查詢接口如何對接呢? 首先我們找到一家有IP地址應用場景查詢API的服務商數脈API,然后注冊賬號,購買免費套餐 接下來就需要技術同學把IP應用場景查詢接口對接到…

數學符號大全

目錄 高數數學符號 科研論文常見數學符號極其含義 圓中間有個點代表點乘 高數數學符號 高數數學符號and數學運算符號及含義 - 知乎 科研論文常見數學符號極其含義 科研中論文常見數學符號及其含義(科研必備,建議收藏)_數學論文中的:-CSDN…

python GUI庫 EEL + VUE.js 開發環境配置 聯調

eel開發環境啟動的服務器默認端口是8000,如果前端界面的開發也是直接在EEL開發環境中進行,一切好辦。但如果前端用vue,則需要另外啟動專用的vue開發環境的服務器(Vue CLI (npm run serve)默認端口是8080,Vite (npm run…

CentOS7中如何docker-compose

在 CentOS 7 上安裝 docker-compose 需要幾個步驟 步驟 1: 安裝 Docker 首先,確保你已經安裝了 Docker。如果沒有安裝,可以通過以下命令安裝: sudo yum update -y sudo yum install -y yum-utils sudo yum-config-manager --add-repo http…

攻防世界(CTF)~web-supersqli(詳細解題思路)

題目介紹 題目描述“隨便注” 先看一下是否存在注入 判斷閉合方式 輸入1’ and 11-- -正常回顯 輸入1and 12-- -無回顯,確認是單引號閉合 看一下列數 輸入1 order by 2-- - 有回顯 輸入1 order by 3-- - 報錯,由此判斷兩列 使用union聯合注入發現select被過濾了&a…

WMS倉儲管理系統如何讓倉庫管理有過程

在當今競爭激烈的商業環境中,WMS倉儲管理系統的智能化與過程化管理顯得尤為重要。一個具有過程管理的WMS倉儲管理系統不僅能夠幫助企業實時監控、分析和調度倉庫作業,還能顯著提升作業效率和成本控制能力。下面,我們就來深入探討一下這種“有…

流媒體zlmediakit

目標: 流媒體部署 內容: 使用開源流媒體zlmediakit docker搭建: docker run -d -p 10000:10000 -p 10000:10000/udp -p 1935:1935 -p 8080:80 -p 8554:554 -p 8443:443 -p 8000:8000/udp -p 9000:9000/udp -p 30000-30050:30000-30050…

IT Tools

vs & vscode工具 Vs Extensions & Remote Development Vs Extensions Remote-SSH VSCode遠程連接到Linux并實現免密碼登錄 Git Graph C cppreference.com cplusplus 鏡像站點 用于下載 QT, Ubuntu, 清華鏡像站點 CMake Download Documents Cmake 構建QT …

IO系列(三) - 文件讀寫操作介紹

一、摘要 在之前的文章中,我們了解到在 Java I/O 體系中,File 類是唯一代表磁盤文件本身的對象。 File 類定義了一些與平臺無關的方法來操作文件,包括檢查一個文件是否存在、創建、刪除文件、重命名文件、判斷文件的讀寫權限是否存在、設置…

撳針在醫保上叫什么?

點擊文末領取撳針的視頻教程跟直播講解 創新型皮內針(撳針)——醫保甲類產品 皮內針(撳針)技術屬于重點推廣的中醫適宜技術,是將特制的小型針具固定于腧穴部位的皮內或皮下做較長時間留針的一種方法,稱“…

2024年 C++音視頻開發學習路線(ffmpeg/rtsp/srs/webrtc/hls)

在音視頻工作領域,很多人可能會陷入徘徊和迷茫的境地。音視頻的知識紛繁復雜,自己學習非常困難,既需要非常扎實的基礎知識,又需要有很多的工程經驗;不知道如何學,怎樣才能查漏補缺自己的技術短板。 對于音…

QT C++ widget layout 嵌套 例子2

在上篇文章中描述了實中套虛(用setLayout),虛中套實(用addWidget)。 本文再加1條,虛中套虛(用addLayout)。 所謂虛中套虛,是layout 套 layout 。 另外用循環代碼生成從…

記錄接口請求偶發504 Gateway Time-out問題

項目場景: 我們將服務部署到A公司服務器中,使用了共五臺服務器,分別是:1.NG服務器 2.日志服務器 3.緩存服務器 4.應用服務器1 5.應用服務器2 。而請求過來首先到達的是他們的物理代理服務器,然后再轉發請求到我們的ng…