当前位置:  编程技术>移动开发
本页文章导读:
    ▪申請Payoneer萬事達卡+好國虛擬銀行帳戶流程        申請Payoneer萬事達卡+美國虛擬銀行帳戶流程 你是Amazon賣家,正在為Amazon收款發愁嗎?你還在為花上幾個月時間用支票來收款而苦惱嗎?你還在因為PayPal沒有信用卡激活而處處受限嗎?你有.........
    ▪ xcode 环境,多工程联编设立【转】        xcode 环境,多工程联编设置【转】 http://blog.csdn.net/vienna_zj/article/details/8467522   一、xcode4中的环境变量 $(BUILT_PRODUCTS_DIR) build成功后的,最终产品路径--可以在Build Settings参数的Per-configurati.........
    ▪ 线程的同步跟异步       线程的同步和异步 )多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全.........

[1]申請Payoneer萬事達卡+好國虛擬銀行帳戶流程
    来源: 互联网  发布时间: 2014-02-18
申請Payoneer萬事達卡+美國虛擬銀行帳戶流程
你是Amazon賣家,正在為Amazon收款發愁嗎?
你還在為花上幾個月時間用支票來收款而苦惱嗎?
你還在因為PayPal沒有信用卡激活而處處受限嗎?
你有eBay店鋪及外貿商城,且正在為PayPal高昂的手續費和無法撤資煩惱嗎?
你在為無法從ClickBank/SellHealth/Peerfly/Conver2Media/Maxbounty等等聯盟及時收款鬱悶嗎?
現在這些問題Payoneer都可以幫你解決。
申請Payoneer萬事達卡+美國虛擬銀行帳戶不需要任何費用,也不需要面簽,更不需要提供稅號,簽證以及親自到美國。
一:申請Payoneer萬事達卡步驟,只需要幾分鐘:
1.進入Payoneer申請網址:http://payoneer-affiliates.com
2.找到“Sign up”後點擊進去 (註冊卡片)

3.填寫申請,總共三步,注意只能用英文字母和數字填寫,系統不接受中文。
例如姓名:張三,輸入時“San Zhang “
例如你的收卡地址:成都市錦江區春熙路21號,輸入時為:chunxilu 21hao , jinjiangqu , chengdu.
(PS. 寄到中國的卡片我們都會郵件質詢你的中文地址,您只要在註冊時使用拼音填寫即可)
  繁體中文: 姓名翻譯查詢
  台灣專用: 地址翻譯查詢
A:點擊Start Here(從這裡開始):
這部分要求你填寫個人信息:姓名+出生年月日+註冊郵箱+地址+電話。

B:Step II(第二步):
這部分主要填寫你在Payoneer的賬戶信息(相當於你網上銀行的信息):
登錄Payoneer“我的賬戶”的用戶名(你的註冊郵箱)+登錄密碼+安全問題等

C:Step III(第三步):
填寫你的證件號碼(身分證號碼)。
此會要求申請者上傳個人身份證(駕駛證+護照均可),所以務必確保你的出生年月日+身份證號碼與即將發送的證件是吻合的。

當你填寫完成後,點擊“Finish(完成)”。
如果頁面指示的部分出現紅色,說明這項填寫的內容不對。
例如:地址太長超出限制,請簡寫你的地址;或者你的用戶名已經存在(表示已經有人使用這個用戶名(註冊的電子郵箱)註冊過P卡),請使用新的電子郵箱填寫。
如果你已經有P卡,後續會幫您合併帳戶,在你已有的P卡賬戶基礎上開通美國銀行賬戶(無需為您寄出新卡)
下圖為Payoneer萬事達卡的價格及費用:

二:Payoneer審批部門審核(3-4個工作日)
1.當你的申請成功遞交後,系統將會快速給你註冊郵箱回信,主題為:Order Card Confirmation
大意是告訴你:你的申請已經遞交成功,我們正在審核中。你的用戶名和密碼為XXX
2.同時大概在幾小時-1天內你將會收到回复並告知Payoneer卡批准並為你簽發。
主題為:Your Payoneer-Affiliates Prepaid debit MasterCard has been approved! (你的P卡已經批准了,然後預計在XX時間為你送到)
3.隨後系統也會發一封郵件,郵件主題為:Withdraw from PayPal, Amazon, Skrill and more! Apply for the US Payment Service!(也就是說邀請你申請美國虛擬銀行戶口)
你將會被要求回答以下問題:
1) What services or products do you offer (include website URLs if applicable)?
您提供什麼樣的服務和什麼樣的實體產品 (如有網址可提供)?
2) Please provide us with direct web links showing some examples of your products, services and other online activity. Please make sure the links include mention of your name or shows your relation to the product/service.
請為我們提供了直接的網頁鏈接,顯示您的產品,服務和其它在線活動的一些例子。請確保鏈接提到你的名字,或顯示你的產品/服務的關係。(沒有就N/A)
3) Please send us a screenshot of your online account with the company you wish to receive payments from (e.g.: PayPal, Amazon, Skrill, etc.). The screenshot should include your name and account balance.
提供你服務的證明(如你是Amazon或PayPal,提供Amazon或PayPal的收款證明、收款歷史記錄等截圖)
4) Please provide a copy of a government-issued photo ID. You can send your driver's license, passport or national ID.
請提供有效的個人證件,可為駕駛證,身份證,護照等等。以JPEG,小於1M的附件格式發給我們。(如果你註冊時提供的是駕駛證號碼,就發生駕駛證;如果是​​身份證,就給身份證。 不需要給全部的證件)
目前Payoneer提供的美國銀行帳戶只接受以下所列美國公司的轉賬:
o Amazon.com Inc. (and its subsidiaries, including CreateSpace, a DBA of On-Demand Publishing, LLC.)
o AOL
o Alamy Inc.
o Apple Inc.
o Barnes & Noble
o Bright Market LLC
o Digital River Inc. (and its subsidiaries, including SWReg)
o E-Trade Financial Corporation
o Facebook Inc.
o Getty Images Inc.
o Google Inc.(and its subsidiaries, including AdMob)
o Half.com Inc.
o Intel Corporation
o Keynetics Inc. (Click Bank)
o LinkedIn Corporation
o LinkShare Corporation
o LSI Corporation
o Microsoft Corporation
o PayPal Inc. (Important Note: Transfers from PayPal to Payoneer are allowed, but transfers from the US Payment Service to PayPal are automatically declined)
o ShareASale.com Inc.
o ValueClick Inc. (Commission Junction)
o Yahoo! Inc.
更多Payoneer目前接受轉帳到美國虛擬銀行戶口的公司White List「點擊這裡查詢」
= = = =獲取美國虛擬銀行帳戶提交資料整理= = = =
收到卡簽發的信息後,你就要開始準備遞交資料開通US payment service獲取Payoneer給你的美國虛擬銀行帳戶了。
怎麼開通呢?根據常見的幾個聯盟來舉例,請找您對應的聯盟並參考下面的清單提供所需文件:
Amazon Seller(亞馬遜賣家)
1.你的身份證
2.截圖1:www.amazon.com的seller central的主頁顯示,上面可以看到你的基本情況“your orders / Amazon selling coach / Seller Performance / Payment Summary”
3.截圖2:www.amazon.com的seller central的“Reports”顯示你的商店在近期的交易情況(Transactions)顯示你Order金額情況或者“Setting”顯示的界面
4.如果你的賣家賬戶目前還沒有資金進入,請提供鏈接顯示你出售的產品
Google Checkout
1.你的身份證
2.你的Checkout截圖1:含有Checkout網址+Checkout的進賬清單(至少大於50刀)
3.你的Checkout截圖2:顯示你在Checkout的註冊信息,至少有一項是能證明是你本人的賬戶(姓名/註冊郵箱等)
Google Admob/Airpush(廣告獲利的App開發者)
1.你的身份證
2.你的Admob/Airpush截圖1:含有網址+進賬清單
3.你的Admob/Airpush截圖2:顯示你的個人註冊信息,至少有一項是能證明是你本人的賬戶(姓名/註冊郵箱等)
4.如果是Paypal 進賬,請提供PP截圖含有PP網頁+PP的Payment from清單有表示為Airpush..Admob等
Commission Junction
1.你的身份證
2.你的CJ截圖1:含有CJ網址+你的CJ姓名+CJ餘額(至少大於50刀)
3.你的CJ截圖2:含有CJ網址+CJ的歷史收入證明
4.提供一個網站能顯示你是為CJ提供何種服務/產品而獲得的佣金
如果你CJ的註冊姓名和真實姓名不符合,請至少提供一張收過支票的截圖,此支票的收款證明必須與3個月的歷史收入證明的其中一筆款項想符合。
Amazon
1.你的身份證
2.你的Amazon截圖1:含有Amazon網址+你的Amazon ID顯示+Amazon餘額(至少大於50刀)
3.你的Amazon截圖2:含有Amazon網址+Amazon的歷史收入證明
4.你的Amazon至少收過一次Gift Card或者支票的證明。如果是Gift Card,請提供Amazon郵件通知時的截圖
5.提供一個網站能顯示你是為Amazon提供何種服務/產品而獲得的佣金
PayPal
1.你的身份證
2.你的PP截圖1:含有PP網址+你的PP姓名+ PP餘額
3.你的PP截圖2:含有PP網址+PP至少近期3個月的收款詳細(Payment from history),資金的來源必須顯示是來自公司!(如果是個人收款, 比如eBay賣家等看下方)
4.你在PP收款所示的公司中的註冊信息。比如PP收款來自CPALEAD,請提供你登錄CPALEAD個人賬戶後能顯示“至少你的姓名/註冊地址/郵箱”等的某一項與你本人一致。
PayPal + eBay (或者其他平台上你出售產品或者服務)
1.你的身份證
2.你的PP截圖1:含有PP網址+你的PP姓名+PP餘額
3.你的PP截圖2:含有至少近期3個月的的收款詳細(Payment from history),資金的來源能顯示是在eBay出售產品所得
4.你的eBay店舖網址,然後至少一項產品的售出與PP收款來源能夠吻合 (例如PP上50美金來自Carle,你的eBay網站能顯示Carle有購買此產品類似的)
5.你的eBay店舖的個人註冊信息,至少有一項能證明這個店舖是你本人的 (例如你的註冊地址可能和P卡註冊時一致/電子郵箱一致類似的)
你可以直接回覆系統郵來的郵件 或是 發到以下郵箱裡給專人處理:
1.英文回复給 uspaymentservice@payoneer.com 決定權的部門。
如果給的資料準確一次性批准。如果給的資料不足,一來一回就是4個工作日起。
尤其是PayPal提現的會員並且擁有個人網站的,強烈建議直接郵件給這個部門。
2.中英文回复給 chinese.support@payoneer.com 客服中心。
需要轉發給相關部門,但一般24小時有人處理回信。
= = = = = =
提交資料後,Payoneer會在1-7天內審核你的申請,快則一星期內一次批核,慢則可能會收到郵件說資料不齊,要你再提供,來回可能更長時間。
若你的申請批核了,你將會收到你在美國銀行賬戶的信息,主題為:Start Direct Deposits to your New Prepaid debit MasterCard card
這封郵件裡你將會看到你的美國銀行賬戶信息為:
BANK NAME:First Century Bank
ACCOUNT TYPE: CHECKING
ACCOUNT #: XXXXXX
ABA #: XXXXX
三: 此美國銀行賬戶信息添加到你需要ACH轉賬的賬戶裡。日後進入的錢,您可以登錄“我的賬戶”查詢進賬明細
四: 收到Payoneer實體卡後,你可立即在接受萬事達卡的ATM提取當地貨幣或者到超市直接刷卡消費,當然也可以直接在網上消費的,比如註冊域名或者購買空間,當然也可以激活你的Paypal帳號並且綁定直接消費。

    
[2] xcode 环境,多工程联编设立【转】
    来源: 互联网  发布时间: 2014-02-18
xcode 环境,多工程联编设置【转】

http://blog.csdn.net/vienna_zj/article/details/8467522

 

一、xcode4中的环境变量

$(BUILT_PRODUCTS_DIR)

build成功后的,最终产品路径--可以在Build Settings参数的Per-configuration Build Products Path项里设置

$(TARGET_NAME)

目标工程名称

$(SRCROOT)

工程文件(比如Nuno.xcodeproj)的路径 

$(CURRENT_PROJECT_VERSION)

当前工程版本号

 

其他:

当编译静态库,设备选模拟器(iPhone 5.0 Simulator),未设置任何Build Settings参数时,默认的基础路径:

/Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf

下面用$()代替上面一长串东东

$(SYMROOT) = $()/Build/Products

$(BUILD_DIR) = $()/Build/Products

$(BUILD_ROOT) =  $()/Build/Products

这三个变量中的$()不会随着Build Settings参数的设置而改变

相反,以下可以通过设置而改变

$(CONFIGURATION_BUILD_DIR) = $()/Build/Products/Debug-iphonesimulator

$(BUILT_PRODUCTS_DIR) = $()/Build/Products/Debug-iphonesimulator

$(CONFIGURATION_TEMP_DIR) = $()/Build/Intermediates/UtilLib.build/Debug-iphonesimulator

$(TARGET_BUILD_DIR) = $()/Build/Products/Debug-iphonesimulator

$(SDK_NAME) = iphonesimulator5.0

$(PLATFORM_NAME) = iphonesimulator

$(CONFIGURATION) = Debug

$(TARGET_NAME) = UtilLib

$(EXECUTABLE_NAME) = libUtilLib.a 可执行文件名

${IPHONEOS_DEPLOYMENT_TARGET} 5.0

$(ACTION) = build

$(CURRENTCONFIG_SIMULATOR_DIR) 当前模拟器路径 

$(CURRENTCONFIG_DEVICE_DIR) 当前设备路径 

 

$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME =

$()/Build/Products/Debug-iphonesimulator

$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) = $()/Build/Intermediates/UtilLib.build/Debug-iphonesimulator

 

自定义变量

${CONFIGURATION}-iphoneos 表示:Debug-iphoneos

${CONFIGURATION}-iphonesimulator 表示:Debug-iphonesimulator

$(CURRENTCONFIG_DEVICE_DIR) = ${SYMROOT}/${CONFIGURATION}-iphoneos

$(CURRENTCONFIG_SIMULATOR_DIR) = ${SYMROOT}/${CONFIGURATION}-iphonesimulator

自定义一个设备无关的路径(用来存放各种架构arm6/arm7/i386输出的产品)

$(CREATING_UNIVERSAL_DIR) = ${SYMROOT}/${CONFIGURATION}-universal

自定义变量代表的值

$(CURRENTCONFIG_DEVICE_DIR) = $()/Build/Products/Debug-iphoneos

$(CURRENTCONFIG_SIMULATOR_DIR) = $()/Build/Products/Debug-iphonesimulator

$(CREATING_UNIVERSAL_DIR) = $()/Build/Products/Debug-universal

 

iphoneos5.0下的编译脚本:

xcodebuild -project "UtilLib.xcodeproj" -configuration "Debug" -target "UtilLib" -sdk "iphoneos5.0" -arch "armv6 armv7" build RUN_CLANG_STATIC_ANALYZER=NO  $(BUILD_DIR)="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

 

iphonesimulator5.0下的编译脚本:

xcodebuild -project "UtilLib.xcodeproj" -configuration "Debug" -target "UtilLib" -sdk "iphonesimulator5.0" -arch "i386" build RUN_CLANG_STATIC_ANALYZER=NO $(BUILD_DIR)="${BUILD_DIR}"  BUILD_ROOT="${BUILD_ROOT}"

加上下面一句表示输出到文件:

> "${BUILD_ROOT}.build_output"

 

lipo脚本工具:合并iPhone模拟器和真机的静态类库,生成通用库

lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}"         "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"

意思是:把"${CURRENTCONFIG_DEVICE_DIR}目录下的.a文件,和${CURRENTCONFIG_SIMULATOR_DIR}目录下的.a文件合并,

在${CREATING_UNIVERSAL_DIR}目录下,生成两个设备都通用的静态库,

例如:lipo -create -output xy.a x.a y.a

 

二、xcode4中build Settings常见参数解析

1.Installation Directory:安装路径

静态库编译时,在Build Settings中Installation Directory设置“$(BUILT_PRODUCTS_DIR)”

Skip Install设为YES

Installation Directory默认为/usr/local/lib

因为Build Location默认时,.a文件会放在很长(比如:/Users/xxx/Library/Developer/Xcode/DerivedData/xxxProgram

dalrvzehhtesxdfqhxixzafvddwe/Build/Products/Debug-iPhoneos)的路径下,或是我们target指定的路径

Skip Install如果是NO,可能会被安装到默认路径/usr/local/lib

2.Public Headers Folder Path:对外公开头文件路径

设为“include”(具体的头文件路径为:$(BUILT_PRODUCTS_DIR)/include/xx.h)

在最终文件.a同级目录下生成一个include目录

默认:/usr/local/include

Public Headers Folder Path这个路径就是使用这lib的某工程需要依赖的外部头文件.导入这路径后,#include/import "xx.h"才能看到

3.User Header Search Paths:依赖的外部头文件搜索路径

设置为“$(BUILT_PRODUCTS_DIR)/include”

和2中路径对应

4.Per-configuration Build Products Path:最终文件路径

比如设为“../app”,就会在工程文件.xcodeproj上一层目录下的app目录里,创建最终文件

默认为$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 

等于$(BUILT_PRODUCTS_DIR)

5.Per-configuration Intermediate Build Files Path:临时中间文件路径

默认为:$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

6.Code Signing Identity:真机调试的证书选择

选一个和Bundle identifier相对应的证书

Library Search Paths:库搜索路径

Architectures:架构,设为 armv6 或 armv7

Valid Architectures:应用框架,可以设为 armv6、 armv7 或i386

Product Name:工程文件名,默认为$(TARGET_NAME)

Info.plist File:info文件路径

Build Variants:默认为normal

Other Linker Flags:其他链接标签

设为“-ObjC”

当导入的静态库使用了类别,需要设为-ObjC

iOS Deployment Target:ios部署对象

比如可以选择设为,ios3到ios5的一种版本

Prefix Header:预编头文件(比如:UtilLib/UtilLib-Prefix.pch)

Precompile Prefix Header:设为“Yes”,表示允许加入预编译头

 

三、workspace(工作区)

作用:管理多个工程(project),多工程联编

 

四、workspace多工程联编设置

一、

1.新建一个静态库工程,比如UtilLib,并生成UtilLib.h和UtilLib.m文件

2.选中需要公开的头文件,

把右侧栏的Target Membership中设置为public

或则,选中工程目录target的Build Phases标签的copy headers项,在public中添加要公开的头文件

3.Architectures设为:armv6 armv7

4.Valid Architectures设为:armv6 armv7 i386

5.Build Products Path设为:$(SRCROOT)/../build

6.Per-configuration Build Products Path设为:

$(SRCROOT)/../build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

7.Per-configuration Intermediate Build Files Path设为:

$(SRCROOT)/../build/$(TARGET_NAME).build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

8.设置安装路径:Installation Directory项

9.设置对外公开的头文件路径:Public Headers Folder Path项

 

10.为静态库添加依赖的shell脚本

选中工程目录target的Build Phases标签,点击由下角的Add Build Phase按钮

在弹出的菜单里选择Add run script项,然后页面中会多出一个Run Script项

在黑框里填写"$SRCROOT/mergeArmSymbols.sh"

建立对此脚本的依赖(编译静态库的后会运行此脚本)

如果编译时设备选的是iphone simulator:

则此脚本会在对应iphone device的产品目录Debug-iphoneos中,生成对device有用的.a静态库,

相反,如果设备选的是iphone device:

则此脚本会在对应iphone simulator的产品目录Debug-iphoneos中,生成对simulator有用的.a静态库

最后,此脚本调用lipo工具,把本工程生成静态库与此脚本生成的静态库合并,生成simulator和device都通用的.a文件

 

11.具体bash shell脚本如下:

mergeArmSymbols.sh

下载右边的图片,然后把后缀改为.sh(其实就是上面的脚本,因为博客园只能上传图片)

静态库编译后的目录结构如下:

 

二、 

1.新建主工程,比如Nuno,添加对静态库的依赖

点击工程,在Build Phases标签的Link Binary With Libraries项中点击加号添加UtilLib.a库

选中上面的红色项,在右边栏的Location选Relative to Project,把值设为../libs/libUtilLib.a

2.设置主工程依赖的外部头文件路径:User Header Search Paths项

$(SRCROOT)/../include

3.设置Header Search Paths为:$(SRCROOT)/../include

4.设置Library Search Paths为:$(SRCROOT)/../libs

编译运行即可实现联编 

 

(备注:选择模拟器iphone 5.0 simulator,编译静态库的时,最终文件会在Debug-iphonesimulator,就算成功.a文件还是红色,

这是可能是xcode的bug,不会自动切换路径

因为$(BUILT_PRODUCTS_DIR)所指的位置,是build/Debug-iphonesos,不是包含最终.a文件的Debug-iphonesimulator;

选择ios Device,编译成的最终文件才在build/Debug-iphonesos下,.a文件变成非红色

所有得用mergeArmSymbols.sh脚本来解决)


    
[3] 线程的同步跟异步
    来源: 互联网  发布时间: 2014-02-18
线程的同步和异步
)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线

程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全局资源造成的,有时为了解

决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,出于这样的安全考虑就必须牺牲

系统处理性能,加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制



同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求

不到,怎么办,A线程只能等待下去

异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程

仍然请求的到,A线程无需等待



显然,同步最最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个

进程崩溃,但没有同步机制的存在,性能会有所提升



java中实现多线程

1)继承Thread,重写里面的run方法

2)实现runnable接口



举个例子:普通B/S模式(同步)AJAX技术(异步)

同步:提交请求->等待服务器处理->处理完返回这个期间客户端浏览器不能干任何事

异步:请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

可见,彼“同步”非此“同步”——我们说的java中的那个共享数据同步(synchronized)

一个同步的对象是指行为(动作),一个是同步的对象是指物质(共享数据)。



4、 Java同步机制有4种实现方式:(部分引用网上资源)

①    ThreadLocal ② synchronized( ) ③ wait() 与 notify() ④ volatile

目的:都是为了解决多线程中的对同一变量的访问冲突
 

ThreadLocal
      ThreadLocal 保证不同线程拥有不同实例,相同线程一定拥有相同的实例,即为每一个使用该

变量的线程提供一个该变量值的副本,每一个线程都可以独立改变自己的副本,而不是与其它线程

的副本冲突。

优势:提供了线程安全的共享对象

与其它同步机制的区别:同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之

间进行通信;而 ThreadLocal 是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源

,这样当然不需要多个线程进行同步了。

java线程 同步与异步 线程池
1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线

程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全局资源造成的,有时为了解

决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,出于这样的安全考虑就必须牺牲

系统处理性能,加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制

同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求

不到,怎么办,A线程只能等待下去

异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程

仍然请求的到,A线程无需等待



显然,同步最最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个

进程崩溃,但没有同步机制的存在,性能会有所提升



java中实现多线程

1)继承Thread,重写里面的run方法

2)实现runnable接口



Doug Lea比较推荐后者,第一,java没有单继承的限制第二,还可以隔离代码



线程池

要知道在计算机中任何资源的创建,包括线程,都需要消耗系统资源的。在WEB服务中,对于web服

务器的响应速度必须要尽可能的快,这就容不得每次在用户提交请求按钮后,再创建线程提供服务

。为了减少用户的等待时间,线程必须预先创建,放在线程池中,线程池可以用HashTable这种数

据结构来实现,看了Apach HTTP服务器的线程池的源代码,用是就是HashTable,KEY用线程对象,

value 用ControlRunnable,ControlRunnable是线程池中唯一能干活的线程,是它指派线程池中的

线程对外提供服务。

出于安全考虑,Apach HTTP服务器的线程池它是同步的。听说weblogic有异步的实现方式,没有研

究过,不敢确定

---------------------------------------------------

--------------------------------------------------
一、关键字:

thread(线程)、thread-safe(线程安全)、intercurrent(并发的)

synchronized(同步的)、asynchronized(异步的)、

volatile(易变的)、atomic(原子的)、share(共享)

二、总结背景:

一次读写共享文件编写,嚯,好家伙,竟然揪出这些零碎而又是一路的知识点。于是乎,Google和

翻阅了《Java参考大全》、《Effective Java Second Edition》,特此总结一下供日后工作学习参

考。

三、概念:

1、 什么时候必须同步?什么叫同步?如何同步?

要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用

synchronized(或 volatile)以确保一个线程可以看见另一个线程做的更改。

为了在线程之间进行可靠的通信,也为了互斥访问,同步是必须的。这归因于java语言规范的内存

模型,它规定了:一个线程所做的变化何时以及如何变成对其它线程可见。

因为多线程将异步行为引进程序,所以在需要同步时,必须有一种方法强制进行。例如:如果2个线

程想要通信并且要共享一个复杂的数据结构,如链表,此时需要确保它们互不冲突,也就是必须阻

止B线程在A线程读数据的过程中向链表里面写数据(A获得了锁,B必须等A释放了该锁)。

为了达到这个目的,java在一个旧的的进程同步模型——监控器(Monitor)的基础上实现了一个巧

妙的方案:监控器是一个控制机制,可以认为是一个很小的、只能容纳一个线程的盒子,一旦一个

线程进入监控器,其它的线程必须等待,直到那个线程退出监控为止。通过这种方式,一个监控器

可以保证共享资源在同一时刻只可被一个线程使用。这种方式称之为同步。(一旦一个线程进入一

个实例的任何同步方法,别的线程将不能进入该同一实例的其它同步方法,但是该实例的非同步方

法仍然能够被调用)。

错误的理解:同步嘛,就是几个线程可以同时进行访问。

同步和多线程关系:没多线程环境就不需要同步;有多线程环境也不一定需要同步。

锁提供了两种主要特性:互斥(mutual exclusion)和可见性(visibility)。

互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议

,这样,一次就只有一个线程能够使用该共享数据。

可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个

线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前

的值或不一致的值,这将引发许多严重问题

小结:为了防止多个线程并发对同一数据的修改,所以需要同步,否则会造成数据不一致(就是所

谓的:线程安全。如java集合框架中Hashtable和Vector是线程安全的。我们的大部分程序都不是线

程安全的,因为没有进行同步,而且我们没有必要,因为大部分情况根本没有多线程环境)。



2、 什么叫原子的(原子操作)?

Java原子操作是指:不会被打断地的操作。(就是做到互斥和可见性?!)

那难道原子操作就可以真的达到线程安全同步效果了吗?实际上有一些原子操作不一定是线程安全

的。

那么,原子操作在什么情况下不是线程安全的呢?也许是这个原因导致的:java线程允许线程在自

己的内存区保存变量的副本。允许线程使用本地的私有拷贝进行工作而非每次都使用主存的值是为

了提高性能(本人愚见:虽然原子操作是线程安全的,可各线程在得到变量(读操作)后,就是各

自玩弄自己的副本了,更新操作(写操作)因未写入主存中,导致其它线程不可见)。

那该如何解决呢?因此需要通过java同步机制。

在java中,32位或者更少位数的赋值是原子的。在一个32位的硬件平台上,除了double和long

型的其它原始类型通常都是使用32位进行表示,而double和long通常使用64位表示。另外,对象引

用使用本机指针实现,通常也是32位的。对这些32位的类型的操作是原子的。

这些原始类型通常使用32位或者64位表示,这又引入了另一个小小的神话:原始类型的大小是

由语言保证的。这是不对的。java语言保证的是原始类型的表数范围而非JVM中的存储大小。因此,

int型总是有相同的表数范围。在一个JVM上可能使用32位实现,而在另一个JVM上可能是64位的。在

此再次强调:在所有平台上被保证的是表数范围,32位以及更小的值的操作是原子的。



3、 不要搞混了:同步、异步

举个例子:普通B/S模式(同步)AJAX技术(异步)

同步:提交请求->等待服务器处理->处理完返回这个期间客户端浏览器不能干任何事

异步:请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

可见,彼“同步”非此“同步”——我们说的java中的那个共享数据同步(synchronized)

一个同步的对象是指行为(动作),一个是同步的对象是指物质(共享数据)。



4、 Java同步机制有4种实现方式:(部分引用网上资源)

①    ThreadLocal ② synchronized( ) ③ wait() 与 notify() ④ volatile

目的:都是为了解决多线程中的对同一变量的访问冲突
ThreadLocal
    ThreadLocal 保证不同线程拥有不同实例,相同线程一定拥有相同的实例,即为每一个使用该

变量的线程提供一个该变量值的副本,每一个线程都可以独立改变自己的副本,而不是与其它线程

的副本冲突。

优势:提供了线程安全的共享对象

与其它同步机制的区别:同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之

间进行通信;而 ThreadLocal 是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源

,这样当然不需要多个线程进行同步了。

volatile
     volatile 修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。

而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。
    优势:这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
    缘由:Java 语言规范中指出,为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而

且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。这样当多个线程同时与某

个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。而 volatile 关键字就

是提示 VM :对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
     使用技巧:在两个或者更多的线程访问的成员变量上使用 volatile 。当要访问的变量已在

synchronized 代码块中,或者为常量时,不必使用。
        线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的

是B。只在某些动作时才进行A和B的同步,因此存在A和B不一致的情况。volatile就是用来避免这种

情况的。 volatile告诉jvm,它所修饰的变量不保留拷贝,直接访问主内存中的(读操作多时使用

较好;线程间需要通信,本条做不到)

Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自

动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的

一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。

您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理

想的线程安全,必须同时满足下面两个条件:

对变量的写操作不依赖于当前值;该变量没有包含在具有其他变量的不变式中。



sleep() vs wait()
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监

控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁

定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁

进入运行状态。

(如果变量被声明为volatile,在每次访问时都会和主存一致;如果变量在同步方法或者同步块中

被访问,当在方法或者块的入口处获得锁以及方法或者块退出时释放锁时变量被同步。)



四、例子:

Demo1:

package test.thread;





class SynTest{



//非同步

static void method(Thread thread){

System.out.println("begin "+thread.getName());

try{

Thread.sleep(2000);

}catch(Exception ex){

ex.printStackTrace();

}

System.out.println("end "+thread.getName());

}



//同步方式一:同步方法

synchronized static void method1(Thread thread){//这个方法是同步的方法,每次只有一

个线程可以进来

System.out.println("begin "+thread.getName());

try{

Thread.sleep(2000);

}catch(Exception ex){

ex.printStackTrace();

}

System.out.println("end "+thread.getName());

}



//同步方式二:同步代码块

static void method2(Thread thread){

synchronized(SynTest.class) {

System.out.println("begin "+thread.getName());

try{

Thread.sleep(2000);

}catch(Exception ex){

ex.printStackTrace();

}

System.out.println("end "+thread.getName());

}

}





//同步方式三:使用同步对象锁

private static Object _lock1=new Object();

private static byte _lock2[]={};//据说,此锁更可提高性能。源于:锁的对象越小越好

static void method3(Thread thread){

synchronized(_lock1) {

System.out.println("begin "+thread.getName());

try{

Thread.sleep(2000);

}catch(Exception ex){

ex.printStackTrace();

}

System.out.println("end "+thread.getName());

}

}



public static void main(String[] args){

//启动3个线程,这里用了匿名类

for(int i=0;i<3;i++){

new Thread(){

public void run(){

method(this);

//method1(this);

//method2(this);

//method3(this);

}

}.start();

}

}

}













Demo2:

package test.thread;



import com.util.LogUtil;





public class SynTest2 {



public static void main(String[] args){

Callme target=new Callme();

Caller ob1=new Caller(target,"Hello");

Caller ob2=new Caller(target,"Synchronized");

Caller ob3=new Caller(target,"World");

}

}



class Callme{





synchronized void test(){

LogUtil.log("测试是否是:一旦一个线程进入一个实例的任何同步方法,别的线程将不能

进入该同一实例的其它同步方法,但是该实例的非同步方法仍然能够被调用");

}



void nonsynCall(String msg){

LogUtil.log("["+msg);

LogUtil.log("]");

}



synchronized void synCall(String msg){

LogUtil.logPrint("["+msg);

LogUtil.log("]");

}

}



class Caller implements Runnable{

String msg;

Callme target;

Thread t;



Caller(Callme target,String msg){

this.target=target;

this.msg=msg;

t=new Thread(this);

t.start();

}


public void run() {

// TODO Auto-generated method stub

//target.nonsynCall(msg);

target.synCall(msg);

target.test();

}

}

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3