在Test類中的method方法是同步的。但上面的代碼建立了兩個(gè)Test類的實(shí)例,因此,test1和test2的method方法是分別執(zhí)行的。要想讓method同步,必須在建立Sync類的實(shí)例時(shí)向它的構(gòu)造方法中傳入同一個(gè)Test類的實(shí)例,如下面的代碼所示:
Sync sync1 = new Sync(test1); 不僅可以使用synchronized來(lái)同步非靜態(tài)方法,也可以使用synchronized來(lái)同步靜態(tài)方法。如可以按如下方式來(lái)定義method方法:
34.class Test
35.{
36. public static synchronized void method() { }
37.}
建立Test類的對(duì)象實(shí)例如下:
38.Test test = new Test();
對(duì)于靜態(tài)方法來(lái)說(shuō),只要加上了synchronized關(guān)鍵字,這個(gè)方法就是同步的,無(wú)論是使用test.method(),還是使用Test.method()來(lái)調(diào)用method方法,method都是同步的,并不存在非靜態(tài)方法的多個(gè)實(shí)例的問(wèn)題。
在23種設(shè)計(jì)模式中的單件(Singleton)模式如果按傳統(tǒng)的方法設(shè)計(jì),也是線程不安全的,下面的代碼是一個(gè)線程不安全的單件模式。
39.package test;
40.
41.// 線程安全的Singleton模式
42.class Singleton
43.{
44. private static Singleton sample;
45.
46. private Singleton()
47. {
48. }
49. public static Singleton getInstance()
50. {
51. if (sample == null)
52. {
53. Thread.yield(); // 為了放大Singleton模式的線程不安全性
54. sample = new Singleton();
55. }
56. return sample;
57. }
58.}
59.public class MyThread extends Thread
60.{
61. public void run()
62. {
63. Singleton singleton = Singleton.getInstance();
相關(guān)推薦:
各地2012年計(jì)算機(jī)等級(jí)考試費(fèi)用匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |