㈠ c++編程錯誤列表及解決方案
C++常見編譯/鏈接錯誤及其解決辦法
1. 解決error LNK2005: ___crtExitProcess 已經在 LIBCMTD.lib(crt0dat.obj) 中定義
有的時候, 在 Debug 模式下編譯沒問題, 換到 Release 模式就發生一堆問題.
典型的例子, 就是因為 c++ runtime library 設定不同, 所造成的重復定義連結錯誤.
而另一個常見的例子是 專案與 library 使用不同的字元集合設定
(如: 一個用 Unicode Character Set, 另一個用 Multi-Byte Character Set)
這個錯誤發生原因, 有可能是
1. 你 link 的 lib 使用 C++ Multi-threaded DLL (/MD)
2. 而你的 source 使用的 C++ runtime library 是 Multi-threaded (/MT)
導致重復定義
解決方法:
兩個使用相同的 C++ runtime library.例如都使用 static 的 Multi-threaded (/MT).
2. 錯誤 1error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已經在 LIBCMT.lib(typinfo.obj) 中定義 MSVCRTD.lib
項目 -> 屬性 -> c/C++ -> 代碼生成 -> 運行時庫 設置為: 多線程調試 DLL (/MDd)
被引用的庫和調用的程序編譯選項不同,需要改成一致後編譯
3.#pragma once與 #ifndef的區別
為了避免同一個文件被include多次
1 #ifndef方式
2 #pragma once方式
在能夠支持這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些聲明語句
#endif
方式二:
#pragma once
... ... // 一些聲明語句
#ifndef的方式依賴於宏名字不能沖突,這不光可以保證同一個文件不會被包含多次,也能保證內容完全相同的兩個文件不會被不小心同時包含。當然,缺點就是如果不同頭文件的宏名不小心「撞車」,可能就會導致頭文件明明存在,編譯器卻硬說找不到聲明的狀況
#pragma once則由編譯器提供保證:同一個文件不會被包含多次。注意這里所說的「同一個文件」是指物理上的一個文件,而不是指內容相同的兩個文件。帶來的好處是,你不必再費勁想個宏名了,當然也就不會出現宏名碰撞引發的奇怪問題。對應的缺點就是如果某個頭文件有多份拷貝,本方法不能保證他們不被重復包含。當然,相比宏名碰撞引發的「找不到聲明」的問題,重復包含更容易被發現並修正。
方式一由語言支持所以移植性好,方式二 可以避免名字沖突
4.error LNK2019: 無法解析的外部符號 __imp__PathCombineW
PathCombine是Shell api 需要引入庫#pragma comment( lib, "shlwapi.lib")
5.error C2662: "MyClass::GetName()」: 不能將「this」指針從「const MyClass」轉換為「MyClass &」
bool MyClass::operator==(const MyClass* n1) const
{return GetName() == n1->GetName();}
原因是不能在const函數中調用對象的非const方法,MyClass中的GetName()必須是const的。
6.template 模板
模板聲明和定義必須在同一個文件中,而且只有實例話模板類型時才編譯模板實例
7.error C2275: 「MyClass」: 將此類型用作表達式非法 MyClass.Instance();
原因:Instance是靜態方法,用.引用會出錯。應該是MyClass::Instance()
8.error LNK2019: 無法解析的外部符號 "public: __thiscall MyClass(void)
原因:只聲明了構造函數,MyClass(); ,但未定義。 可以定義空函數,或者直接注釋掉,使用默認構造函數。
9.error C2504: 「testing」: 未定義基類
class PackToolTest : testing.Test {}
原因:Test是testing命名空間下的一個類,需要用域操作符,testing::Test
還有一個問題,缺少基類繼承許可權(public、protected、private)
10.error C2864: 「MyClass::_nullpack」: 只有靜態常量整型數據成員才可以在類中初始化
class MyClass {string _nullpack = "test";}
原因:c++ 中,成員變數不能在聲明時初始化,而是在構造函數初始化列表中先初始化
11.error LNK2019: 無法解析的外部符號_WinMain@16int main()
原因:由於創建的是Win32 Project,和Win32 console Project的鏈接庫不同
方法1:在程序最開始的地方加上以下語句
#pragma comment(linker, "/subsystem:console ")
方法2:project > > setting > > 在link 的project options 中將/subsystem:windows(console)刪了
12.類似「已經在 msvcprtd.lib(MSVCP80D.dll) 中定義」問題
vs2005 Debug /Release需要分別配製
分析一下錯誤來源,會發現:
1. 錯誤來源主要是重復定義的問題,而且重復定義的基本上都是VC Runtime和Standard C++ Library中的函數
2. LIBCMT和LIBCPMT為Release下的Lib,本來不應該出現在Debug版本的鏈接的Lib中
3. 重復定義的問題主要出現在:LIBCMT, LIBCPMT, MSVCPRTD, MSVCRTD
來看看出問題的LIB是那些:
1. LIBCMT:C Runtime庫的多線程靜態鏈接的Release版本
2. LIBCPMT:C++ Standard Library的多線程靜態鏈接的Release版本
3. MSVCPRTD:C++ Standard Library的多線程DLL的Debug版本
4. MSVCRTD:C Runtime Library的多線程DLL的Debug版本
當 前我們的配置是多線程DLL的Debug版,因此3和4是應該出現在link的列表中的,不屬於多餘。而後兩者則是只是當多線程靜態鏈接Release版 中才會出現。這提示我在項目中加入的ANTLR.LIB可能是造成這個問題的根源,因為靜態庫的編譯選項很容易和主程序發生沖突,並且根據實際信息我們可 以看出ANTLR.LIB應該是用多線程靜態鏈接的Release版本來編譯的。
解決方法:
1、首先查看編譯項目依賴的其他項目的運行時庫是否一致
2、如果不一致,改為同樣的運行時庫,如在下編譯的是:「多線程調試 DLL (/MDd)」,現在需要把所有的依賴項目的運行時庫都改為一致的庫,就OK了。
13.error C2143: 語法錯誤 : 缺少「;」(在「*」的前面)
原因:產生錯誤處,某類型未include,可能頭文件名拼寫錯誤、頭文件名已更改
14.error C2572: 「MyClass::Invoke」: 重定義默認參數 : 參數 2
string MyClass::Invoke(const CParam& paraObj, INVOKETYPE type = ASYN)
原因:默認參數,只需在聲明時指定。方法定義的時候無需指定默認參數。
string MyClass::Invoke(const CParam& paraObj, INVOKETYPE type /*= ASYN*/)
{ ... }。。。。。
希望對你有用
㈡ 在android4.0.幾的版本上會出現這個問題,在線求解答
看不見
㈢ C++多線程編程問題
多線程工作可以提高解決問題的速度
你舉得例子可以多線程實現,但是更多的人稱之為分布式計算
多線程主要是創建多個線程,每個線程負責自己的事情,每個線程只對主線程負責
至於解決問題的速度應該可以達到提高一半,但是你要注意資源的互斥,互斥處理不好估計會事倍功半
㈣ java的多線程和CPU
CPU對於各個線程的調度是隨機的(分時調度),而在Java中,JVM負責線程的調度,可更好地分配CPU的使用權。對於線程的調度一般有兩種模式,分時調度和搶占式調度。分時調度是按照順序平均分配;搶占調度是按照優先順序來進行分配。
㈤ 為什麼多線程,junit 中無法使用spring 依賴注入
因為spring為了考慮安全性問題,在多線程情況下,不支持直接使用@Resouce註解方式進行直接的bean注入,那麼也就是說,如果在多線程調用該注入實例化的變數時,將會報NullPointerException。
解決法:多線程情況下,通過調用的service進行傳入需要操作的bean變數,而多線程只是將前台工作轉移到後台。
如下:#CalculateServiceImpl.java服務實現,傳入需要調用的bean
㈥ 什麼是matlab多線程編程
一直到 MATLAB 7.4 (R2007a)之前,MATLAB都是不支持多線程、多處理器的。並且到現在為止,MATLAB本身還是一個單線程的應用程序。隨著多處理器的普及,從MATLAB 7.4 (R2007a)以後,MathWorks公司發布了Parallel Computing Toolbox ,用來發揮多處理器的功能(注意:多處理器與多線程有著明顯的區別,單處理器上也可以實現多線程,比如說JAVA, C++等語言)。
可能的原因(有些是我個人的觀點、非MathWorks公司的文獻):使用MATLAB的用戶,一般用作處理大量的數據、畫圖、模擬等。我們知道,對於這些應用,數據之間的依賴性(dependency)特別高,學過computer science的用戶可能知道,當數據之間的依賴性特別高時,多線程的優點幾乎體現不出來,因為一個線程的執行,必須等另外一個線程結束才可以。
隨著Parallel Computing Toolbox工具箱的發布,很多大學開始建立Parallel Computing Toolbox實驗室(比如說新加坡南洋理工大學,該實驗室里使用100多台電腦來做Parallel Computing Toolbox,幫助研究人員處理海量數據),MATLAB通過Parallel Computing Toolbox,可以把任務分配給多個worker(可以理解為一個處理器,但不等同)。根據我個人的使用經驗,使用Parallel Computing Toolbox處理海量數據,有著非常明顯的優勢。
㈦ mplayer 是多線程處理的嗎
gentoo安裝和使用進行了將近一天的驚心動魄的升級後(很慶幸系統沒有掛掉,而且感覺更快了),終於想靜下心來把一個星期以來的安裝、配置以及升級gentoo大致寫出來,一是想紀念一下,另外也許對其他想用gentoo的朋友有一些參考價值。我使用linux不算很長,大概用了一年半的ubuntu和一年的archlinux。用archlinux時逛論壇經常有人談及gentoo,好像用 gentoo的都是高手。當時感覺可笑,各各發行版區別都那麼大嗎,之前用ubuntu轉到archlinux也就是顯卡驅動那碰到點問題,其他都比較順 利,gentoo又能難到哪去呢?另外gentoo安裝軟體都是要編譯的,我的本性能也不好,就想如果以後換了新的再考慮吧,所以中間雖然想了幾次,但一 定沒有嘗試。一個星期前(2010 3月4號),我把mplayer和ffmpeg都手動升級下,發現編譯起來有點糾結,mplayer需要ffmpeg的源碼,但ffmpeg還要單獨編 譯,後來讓mplayer用ffmpeg的so後升級ffmpeg後mplayer居然掛了,重編了幾回才弄好。系統里有好幾個包都自己編譯,主要是想去 掉不用的依賴,但手動維護太麻煩了,於是又想到了gentoo。當時已經10點多了,於是想第二天開始著手。廢話完畢。 www.dnjsb.com 之前的硬碟分區就這樣的:/dev/sda1 ext4 6g //dev/sda2 2g 未使用/dev/sda3 ntfs 30g/dev/sda4 jfs 66g /home其中/dev/sda2是以前的swap,但後來不用休眠功能後感覺swap意思不大,就不用了。其餘的三個分區都比較重要,基本動不得,這給怎麼裝啊。想來想去,先用sda2試試吧,如果裝不上就沒事了,裝上再進一步考慮吧。於是把sda2格成了reiserfs(某人說這種格式好,但我從來沒用過,正好體驗一下)。下載 stage3-i686-20110301.tar.bz2 和portage-latest.tar.xz。(前一個文件一周一更新)(我用的32位)國內的鏡像有:http://mirrors.163.com/gentoo/http://mirrors.sohu.com/gentoo/http://mirror.bjtu.e.cn/gentoo/http://mirrors.xmu.e.cn/gentoo/這兩個文件可以在里邊找。把sda2掛在/media/z上,並把文件放進去:sudo mount /dev/sda2 /media/zsudo tar xvpf stage3-i686-20110301.tar.bz2 -C /media/zsudo tar xvpf portage-latest.tar.xz -C /media/z/usr准備chroot環境:sudo mount -t proc none /media/z/procsudo mount -vt devpts devpts /media/z/dev/ptssudo chroot /media/z/ /bin/bash現在就chroot進去了,之後的操作如不特別說時都是在這個環境下進行的。 www.dnjsb.com 初始化環境變數:env-update;source /etc/profile修改/etc/make.conf,這個非常重要,最好首先改到位,不然之後有你受的(我就是,不得要領,改了多回,改完還要重編譯各種東西):加入源:GENTOO_MIRRORS=http://mirror.bjtu.e.cn/gentoo/SYNC=rsync://mirror.bjtu.e.cn/gentoo-portage上邊那四個網站都有說明如何寫這個。MAKEOPTS=-j3 #-jn,n是內核數加1,多線程編譯用的,不設置也行INPUT_DEVICES=keyboard mouse synaptics #鍵盤、滑鼠、觸摸板#下面的是很重要的USE,開始時可以只用USE=X gtk,但最開始寫好以前就省事了,不然以後會麻煩重重。USE=-pppd -alsa -fortran sse sse2 ssse3 mmx sdl v4l v4l2 oss oss4 X gtk unicode truetype jpeg png gif cairo zsh-completion fontconfig videoopenglVIDEO_CARDS=radeon #這個至關重要,顯卡驅動類型,具體請查看官方wiki,我的是ati x2300,只能用這個開源驅動。#CCEPT_KEYWORDS=~x86 #這個要注意,如果要用最新的軟體,可以加上這行,但如果是第一次裝,強烈不建議加,不然會提升安裝難度先改這些就差不多了。改/etc/locale.gen,加(按照自已需要寫)en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8zh_CN.GB2312 GB2312zh_CN.GBK GBK運行locale-gencp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改/etc/conf.d/clockCLOCK=localTIMEZONE=Asia/Shanghai改/etc/resolv.conf,把本機的/etc/resolv.conf內容寫出其中,不然上不了網。改/etc/fstab,這個也可以安裝完內核再寫,這個應該都會寫。查看網路是否正常(如果電腦聯網了,resolv.conf也改了就可以上了),然後同步portage(如果portage-latest.tar.xz是剛下的也可以略過這步,但最好還是運行下吧):emerge --sync安裝內核源碼:emerge gentoo-sources下邊就開始編譯內核了,如果有手動配置內核的經驗強烈建議手動配置編譯:cd /usr/src/linuxmake menuconfigmake; make moles_installcp arch/x86/boot/bzImage /boot,不然最好使用genkernel:emerge genkernelcd /usr/src/linux/genkernel --menuconfig all關於配置內核請上網自行查詢,如果下一種方式實在不會也可以不配置,一般也能啟動起來。編譯時間和很多因素有關,幾十分鍾到幾小時不等。用戶相關:(osily是自己要創建的用戶名)passwseradd -m -G audio,cdrom,portage,usb,video,wheel,users -s /bin/bash osilypasswd osily如果fstab之前沒改好現在一定要改好,然後改自己系統的/boot/grub/menu.lst。此處官方wiki寫的很清楚,建議查看。 www.dnjsb.com 現在可以繼續安裝其他軟體,如xorg-server,但最好還是重啟看看能不能進去。如果不能的話多半是內核(尤其是自己編譯的內核)的問題,如果內核沒問題,看看/boot/grub/menu.lst是不是有問題,多改幾回。如果可以正常進去的話,可以直接在這繼續編譯,但最好還是返回原來的系統繼續。可以寫個類似這樣的腳本:#!/bin/bashsudo mount /dev/sda2 /media/z/sudo mount -t proc none /media/z/procsudo mount -vt devpts devpts /media/z/dev/ptssudo chroot /media/z/ /bin/bash運行就可以進去chroot環境,如果進去環境變數不正常運行:env-update;source /etc/profile然後就是安裝需要的東西了,主要看自己了,比如dhcpcd、sudo、vim,一般的工具直接emerge xxx就可以了,emerge的具體用法網上查吧。但如果你想要桌面環境的話,最好按以下的步驟:安裝點基本工具後,直接安裝xorg-server,注意前提/etc/make.conf里顯卡和輸入設備等變數一定是正確的。這會安裝許多東西,基本要用一個小時以上,耐心等待吧。安裝完後:(xorg-x11和驅動相關,請查看官網wiki相關部分,這部好像可以省略,記不清了) www.dnjsb.com eselect opengl set xorg-x11如果安裝好了,可以先重啟試試,進去後,運行startx,這是很刺激的一刻了,如果顯示找不到xterm找不到什麼的,恭喜你,顯卡驅動基本正常了,不 然就會有各種稀奇古怪的問題&&×&%×&,那麼也恭喜你,在接下來的時間你將對安裝顯卡驅動、寫 xorg.conf等有深刻而透徹的了解。如果是前者,你可以回去繼續安裝其他東西,如xterm(最好安裝完再重啟下看看是不是正常,如果不正常,那麼你可以回過頭處理顯卡驅動問題了)、openbox甚至gnome、kde。下文再說。如果是後者或者剛才的xterm顯示解析度不對、滑鼠鍵盤觸摸板不能用,那麼你要折騰一會了,雖然之前安裝內核沒有難到你,這里很可能讓足夠糾結甚至放棄。這也是我安裝過程中最混亂的地方,已經沒法清晰地回憶了,因為這的問題我先後重裝了4次,(第一次因為2g空間不夠,2、3次都因為X段錯誤,非常糾結),而且其中改了幾回顯卡驅動類似,重編譯了多回。如果是X段錯誤,看出錯信息是不是載入某個so出的錯,如果是可以先把那個so移到別的地方重試。如果不是段錯誤,可能是xorg.conf有問題,有的驅動是不需要這個問題的,默認也是沒有了,所以如果有先刪掉試試,不行的話用X -configure生成一個新的再X -config xorg.conf.new嘗試如果不行的話,還很有可能是內核沒配置的問題,這往往比較麻煩,可以先仔細閱讀官網wiki,不行再去linuxsir等論壇去找找或者問問。重編譯內核後最好把和X相關的包也重編譯下(有許多)。再有很可能是你選擇的驅動不支持你的顯卡,比如老的ati顯卡很多都不能用現在的閉源驅動。這樣可以試試其他的,改/etc/make.conf,然後必須把相關的包重新編譯。還有其他的可能吧如果xterm能進去了,但滑鼠鍵盤等不能用,保證/etc/make.conf正確的話,安裝xf86-input-evdev,如果xf86-input-keyboard xf86-input-mouse xf86-input-synaptics 沒有的話說明/etc/make.conf沒寫對,這時安裝上這幾個包也未必好用,可能要重新編譯更多包。這個問題應該是比較好解決的。如果分辯率不正常,首先要確認用的不是xf86-video-vesa的驅動(按我的流程不會安裝到這個包),如果是那很可以解析度就不調不正常了。然後還是顯卡驅動安裝問題,還有xorg.conf,上網多找找吧。顯卡驅動問題如果一時解決不了的話,可能會拖很長時間,甚至直到放棄,或者你甘願不用圖形界面。 www.dnjsb.com 如果以上都正常了,gentoo離你就很近了。接下來主要部署桌面環境,推薦比較輕量的,(如openbox、fluxbox、fvwm、dwm、awesome等),可以配合面板(tint2、bmpanel、pypanel等),不然要花很長時間編譯。安裝完後就按自己的需要進行配置了。現在還沒有涉及的問題主要還有:音效卡、網卡、攝像頭等設備的驅動,以及觸摸板不正常等。如果觸摸板用手指點無反應,但手指移動有反應,試試:synclient TapButton1=1如果橫向滾動不能用:synclient HorizEdgeScroll=1其他問題請查詢synclient用法要把上邊的命令放在啟動腳本里,如是.xinitrc,確保它能在進入X前被調用。音效卡問題,如果用alsa的話,genkernel默認編譯的內核包含了alsa驅動,應該就要以正常使用了,如果沒包含就要有點麻煩。如果內核包含了oss驅動(這是舊版本的),可能也可以正常用,但效果應該不好,能忍就算了吧。 www.dnjsb.com 如果都沒有的話如果內核啟用的音效卡支持(menuconfig里有一層的里邊是alsa和oss,它的上一層要選上),你可以選擇安裝alsa或者oss 驅動,個人推薦用oss4,它音質比較好,佔用資源少(我試和內核的alsa里比mplayer放mp3時cpu佔用省了一半)。但安裝oss4不是很容 易,因為它不在portage里,要用layman,還要能連接國外網。alsa沒裝過,官網wiki有詳細說明。如果現在就要安裝oss4,也好:emerge laymanlayman -a oss-overlay然後再/etc/make.conf里加一句:source /var/lib/layman/make.conf然後emerge oss或者emerge oss-devel如果網路沒問題的話應該正常安裝。要保證/usr/src/linux指向的是當前用的內核然後/etc/init.d/oss start,一般要等幾分鍾因為要編譯內核模塊,如果成功了基本就可以用了,可以試試osstest,不成功的話問題就麻煩了,很可能你要重新編譯內核
㈧ C語言可以實現 中斷 和 多線程 這類功能嗎
「暈,C語言不是灰常強大,無所不能嗎?怎麼有人說C語言不能實現 中斷 和多線程??」這句話要分兩部分來說,首先「暈,C語言不是灰常強大,無所不能嗎?」。沒有任何一種語言可以無所不能,原因很簡單,任何的語言都脫離不了編譯工具,而編譯工具脫離不了編譯環境。由於編譯環境的不同,因此編譯工具也有所不同,有得只針對JAVA,有得指針對C++,有得只針對C#。不管C語言多厲害,如果編譯工具不支持,那也沒有辦法在這個編譯工具上編譯,以至於沒有辦法在那個編譯工具的編譯環境中運行。所以不能說無所不能。
「怎麼有人說C語言不能實現 中斷 和多線程啊」,這是一個概念性問題。純粹的C語言只是一個工具,更多的是一種定義,一種格式,可以抽象成一種風格。就像定義一個整型變數i。為什麼你不能用integer i定義,非得int i。例如函數的編寫形式,命名規則等等。假如按照C語言的這些規則來編寫程序,同時編譯工具支持C語言,提供中斷庫,還有多線程庫,那麼C語言同樣也可以實現中斷和多線程。舉個例子:例如你手頭上只有一個TC編譯工具,雖然他支持C語言,但是只能編譯16位的DOS程序,礙於這個編譯工具的局限性,所以你永遠也寫不出像Windows操作系統那種帶窗口界面的Win32程序,也不能寫一個針對.NET框架的網路服務程序。同樣的,假如你要開發一個Windows軟體,使用VC編譯器,而這個編譯工具本身帶多線程庫,同時支持Windows系統的很多調用,所以你完全可以以C語言的風格在這個編譯器中調用各種Win32 SDK,開發一個多線程的Windows應用程序。假如你要使用中斷,在Windows環境下可以使用微軟提供的DDK(驅動開發包),他同樣支持C語言,那麼你就可以通過這個開發包調用很多中斷。在Linux環境下,不需要開發包就可以直接調用,因為Linux自帶了很多系統調用都是開放的。頭文件聲明直接就在Linux文件系統的Sys目錄下。所以說他僅僅是一種風格。依賴於編譯環境的系統調用同樣也依賴於編譯環境提供的鏈接庫。
㈨ servlet多線程
1.javax.servlet.SingleThreadModel介面是一個標識介面,如果一個Servlet類實現了這個介面,那麼Servlet容器將保證在同一個時刻只有一個線程可以在給定的servlet實例的service方法中執行。而將其他所有請求進行排隊。
伺服器可以使用多個實例來處理請求,代替單個實例的請求排隊帶來的效益問題。伺服器創建一個Servlet類的多個Servlet實例組成的實例池,對於每個請求分配Servlet實例進行響應處理,之後放回到實例池中等待下此請求。這樣就造成並發訪問的問題。
此時,局部變數(欄位)也是安全的,但對於全局變數和共享數據是不安全的,需要進行同步處理。而對於這樣多實例的情況SingleThreadModel介面並不能解決並發訪問問題。因此,不建議實現SingleThreadModel介面,因為它在servlet規范中已經被廢棄了。
2.使用同步塊Synchronized,防止可能非同步調用的代碼塊。這意味著線程需要排隊處理。在使用同板塊的時候要盡可能的縮小同步代碼的范圍,不要直接在sevice方法和響應方法上使用同步,這樣會嚴重影響性能。
ServletContext是可以多線程同時讀/寫屬性的,線程是不安全的。要對屬性的讀寫進行同步處理或者進行深度Clone()。
所以在Servlet上下文中盡可能少量保存會被修改(寫)的數據,可以採取其他方式在多個Servlet中共享,比方我們可以使用單例模式來處理共享數據。
HttpSession(線程是不安全的)
HttpSession對象在用戶會話期間存在,只能在處理屬於同一個Session的請求的線程中被訪問,因此Session對象的屬性訪問理論上是線程安全的。
當用戶打開多個同屬於一個進程的瀏覽器窗口,在這些窗口的訪問屬於同一個Session,會出現多次請求,需要多個工作線程來處理請求,可能造成同時多線程讀寫屬性。
這時我們需要對屬性的讀寫進行同步處理:使用同步塊Synchronized和使用讀/寫器來解決。
對於每一個請求,ServletRequest由一個工作線程來執行,都會創建有一個新的ServletRequest對象,所以ServletRequest對象只能在一個線程中被訪問。所以ServletRequest是線程安全的。ServletRequest對象在service方法的范圍內是有效的,不要試圖在service方法結束後仍然保存請求對象的引用。
對於集合, 使用線程安全的Vector代替ArrayList,使用Hashtable代替HashMap。
不要在Servlet中創建自己的線程來完成某個功能。
Servlet本身就是多線程的,在Servlet中再創建線程,將導致執行情況復雜化,出現多線程安全問題。
,在多個servlet中對外部對象(比方文件)進行修改操作一定要加鎖,做到互斥的訪問
對於為什麼要在doget方法里另上同步塊,就是因為解決:當a,b同時訪問時,如果a比b稍慢一些就會出現這樣的情況,a頁面空白,而b頁面出現了服務端返回給a的結果,假如是比較敏感的個人信息不能讓他人知道 的,而這種情況就會出現嚴重的安全問題,使用同步塊並加鎖可以做到a,b訪問時兩者的信息不會被對方及第三方知道!