ç»å¸¸çå°ä»ç» ArrayList åHashMapæ¯å¼æ¥ï¼VectoråHashTableæ¯åæ¥,è¿éåæ¥æ¯çº¿ç¨å®å ¨çï¼å¼æ¥ä¸æ¯çº¿ç¨å®å ¨çï¼ä¸¾ä¾è¯´æ:
å½å建ä¸ä¸ªVector对象æ¶åï¼
Vector ve=new Vector();
ve.add(â1â);
å½å¨å¤çº¿ç¨ç¨åºä¸ï¼ç¬¬ä¸ä¸ªçº¿ç¨è°ç¨ä¿®æ¹å¯¹è±¡veçæ¶åï¼å°±ä¸ºå ¶ä¸äºéï¼å ¶ä»çº¿ç¨åªæçå¾ ã
å½å建ä¸ä¸ªArrayList对象æ¶åï¼
ArrayList list=new ArrayList();
list.add(â1â);
å½å¨å¤çº¿ç¨ç¨åºä¸ï¼ç¬¬ä¸ä¸ªçº¿ç¨è°ç¨ä¿®æ¹å¯¹è±¡listçæ¶åï¼æ²¡æä¸ºå ¶ä¸éï¼å ¶ä»çº¿ç¨è®¿é®æ¶å°±ä¼æ¥éã
egï¼list.remove(â1â),ç¶ååç±å ¶ä»çº¿ç¨è®¿é®list对象ç1æ¶å°±ä¼æ¥éã
Java å¼æ¥ä¸åæ¥åºç¨
æè°å¼æ¥è¾å ¥è¾åºæºå¶ï¼æ¯æå¨è¿è¡è¾å ¥è¾åºå¤çæ¶ï¼ä¸å¿ çå°è¾å ¥è¾åºå¤çå®æ¯æè¿åãæ以å¼æ¥çåä¹è¯æ¯éé»å¡ï¼None Blockingï¼ã
ç½ä¸æå¾å¤ç½åç¨å¾éä¿çæ¯å» æåæ¥åå¼æ¥è®²è§£çå¾éå½» 转è¿æ¥
举个ä¾åï¼æ®éB/S模å¼ï¼åæ¥ï¼AJAXææ¯ï¼å¼æ¥ï¼
åæ¥ï¼æ交请æ±->çå¾ æå¡å¨å¤ç->å¤çå®æ¯è¿å è¿ä¸ªæé´å®¢æ·ç«¯æµè§å¨ä¸è½å¹²ä»»ä½äº
å¼æ¥: 请æ±éè¿äºä»¶è§¦å->æå¡å¨å¤çï¼è¿æ¯æµè§å¨ä»ç¶å¯ä»¥ä½å ¶ä»äºæ ï¼->å¤çå®æ¯
åæ¥å°±æ¯ä½ å«æå»åé¥ï¼æå¬å°äºå°±åä½ å»åé¥ï¼å¦æ没æå¬å°ï¼ä½ å°±ä¸åçå«ï¼ç´å°æåè¯ä½ å¬å°äºï¼æä¸èµ·å»åé¥ã
å¼æ¥å°±æ¯ä½ å«æï¼ç¶åèªå·±å»åé¥ï¼æå¾å°æ¶æ¯åå¯è½ç«å³èµ°ï¼ä¹å¯è½çå°ä¸çæå»åé¥ã
æ以ï¼è¦æè¯·ä½ åé¥å°±ç¨åæ¥çæ¹æ³ï¼è¦è¯·æåé¥å°±ç¨å¼æ¥çæ¹æ³ï¼è¿æ ·ä½ å¯ä»¥çé±ã
以é讯为ä¾
åæ¥:åéä¸ä¸ªè¯·æ±,çå¾ è¿å,ç¶åååéä¸ä¸ä¸ªè¯·æ±
å¼æ¥:åéä¸ä¸ªè¯·æ±,ä¸çå¾ è¿å,éæ¶å¯ä»¥ååéä¸ä¸ä¸ªè¯·æ±
并å:åæ¶åéå¤ä¸ªè¯·æ±
ä¸é¢å转ä¸æ®µå ³äºjavaå¼æ¥åºç¨çæç«
ç¨å¼æ¥è¾å ¥è¾åºæµç¼åSocketè¿ç¨éä¿¡ç¨åº
å¨Merlinä¸å å ¥äºç¨äºå®ç°å¼æ¥è¾å ¥è¾åºæºå¶çåºç¨ç¨åºæ¥å£å ï¼java.nioï¼æ°çè¾å ¥è¾åºå ï¼å®ä¹äºå¾å¤åºæ¬ç±»åç¼å²(Buffer)ï¼ï¼java.nio.channels(ééåéæ©å¨çï¼ç¨äºå¼æ¥è¾å ¥è¾åº)ï¼java.nio.charsetï¼å符çç¼ç 解ç ï¼ãéé (Channel)é¦å å¨éæ©å¨(Selector)ä¸æ³¨åèªå·±æå ´è¶£çäºä»¶ï¼å½ç¸åºçäºä»¶åçæ¶ï¼éæ©å¨ä¾¿éè¿éæ©é®(SelectionKey)éç¥å·²æ³¨åçééãç¶åééå°éè¦å¤ççä¿¡æ¯ï¼éè¿ç¼å²ï¼Bufferï¼æå ï¼ç¼ç /解ç ,å®æè¾å ¥è¾åºæ§å¶ã
ééä»ç»ï¼
è¿é主è¦ä»ç»ServerSocketChannelå SocketChannel.å®ä»¬é½æ¯å¯éæ©ç(selectable)ééï¼åå«å¯ä»¥å·¥ä½å¨åæ¥åå¼æ¥ä¸¤ç§æ¹å¼ä¸ï¼æ³¨æï¼è¿éçå¯éæ©ä¸æ¯æå¯ä»¥éæ©ä¸¤ç§å·¥ä½æ¹å¼ï¼èæ¯æå¯ä»¥æéæ©ç注åèªå·±æå ´è¶£çäºä»¶ï¼ãå¯ä»¥ç¨channel.configureBlocking(Boolean )æ¥è®¾ç½®å ¶å·¥ä½æ¹å¼ãä¸ä»¥åçæ¬çAPIç¸æ¯è¾ï¼ServerSocketChannelå°±ç¸å½äºServerSocket (ServerSocketChannelå°è£ äºServerSocket),èSocketChannelå°±ç¸å½äºSocket ï¼SocketChannelå°è£ äºSocketï¼ãå½ééå·¥ä½å¨åæ¥æ¹å¼æ¶ï¼ç¼ç¨æ¹æ³ä¸ä»¥åçåºæ¬ç¸ä¼¼ï¼è¿é主è¦ä»ç»å¼æ¥å·¥ä½æ¹å¼ã
æè°å¼æ¥è¾å ¥è¾åºæºå¶ï¼æ¯æå¨è¿è¡è¾å ¥è¾åºå¤çæ¶ï¼ä¸å¿ çå°è¾å ¥è¾åºå¤çå®æ¯æè¿åãæ以å¼æ¥çåä¹è¯æ¯éé»å¡ï¼None Blockingï¼ãå¨æå¡å¨ç«¯ï¼ServerSocketChanneléè¿éæå½æ°open()è¿åä¸ä¸ªå®ä¾serverChlãç¶å该ééè°ç¨ serverChl.socket().bind()ç»å®å°æå¡å¨æ端å£ï¼å¹¶è°ç¨registerï¼Selector sel, SelectionKey.OP_ACCEPTï¼æ³¨åOP_ACCEPTäºä»¶å°ä¸ä¸ªéæ©å¨ä¸ï¼ServerSocketChannelåªå¯ä»¥æ³¨åOP_ACCEPTäºä»¶ï¼ãå½æ客æ·è¯·æ±è¿æ¥æ¶ï¼éæ©å¨å°±ä¼éç¥è¯¥ééæ客æ·è¿æ¥è¯·æ±ï¼å°±å¯ä»¥è¿è¡ç¸åºçè¾å ¥è¾åºæ§å¶äºï¼å¨å®¢æ·ç«¯ï¼clientChlå®ä¾æ³¨åèªå·±æå ´è¶£çäºä»¶åï¼å¯ä»¥æ¯OP_CONNECT,OP_READ,OP_WRITEçç»åï¼ï¼è°ç¨clientChl.connect (InetSocketAddress )è¿æ¥æå¡å¨ç¶åè¿è¡ç¸åºå¤çã注æï¼è¿éçè¿æ¥æ¯å¼æ¥çï¼å³ä¼ç«å³è¿åè继ç»æ§è¡åé¢ç代ç ã
éæ©å¨åéæ©é®ä»ç»ï¼
éæ©å¨ï¼Selectorï¼çä½ç¨æ¯ï¼å°ééæå ´è¶£çäºä»¶æ¾å ¥éåä¸ï¼èä¸æ¯é©¬ä¸æ交ç»åºç¨ç¨åºï¼ç已注åçééèªå·±æ¥è¯·æ±å¤çè¿äºäºä»¶ãæ¢å¥è¯è¯´ï¼å°±æ¯éæ©å¨å°ä¼éæ¶æ¥åå·²ç»åå¤å¥½äºçééï¼èä¸æ¯æç §å è¿å åºç顺åºãé£ä¹ï¼éæ©å¨æ¯éè¿ä»ä¹æ¥æ¥åçå¢ï¼éæ©é®(SelectionKey)ãéæ©é®çä½ç¨å°±æ¯è¡¨æåªä¸ªééå·²ç»å好äºåå¤ï¼åå¤å¹²ä»ä¹ãä½ ä¹è®¸é©¬ä¸ä¼æ³å°ï¼é£ä¸å®æ¯å·²æ³¨åçééæå ´è¶£çäºä»¶ãä¸éï¼ä¾å¦å¯¹äºæå¡å¨ç«¯serverChlæ¥è¯´ï¼å¯ä»¥è°ç¨key.isAcceptable()æ¥éç¥serverChlæ客æ·ç«¯è¿æ¥è¯·æ±ãç¸åºçå½æ°è¿æï¼SelectionKey.isReadable(),SelectionKey.isWritable()ãä¸è¬çï¼å¨ä¸ä¸ªå¾ªç¯ä¸è½®è¯¢æå ´è¶£çäºä»¶ï¼å ·ä½å¯åç §ä¸é¢ç代ç ï¼ãå¦æéæ©å¨ä¸å°æ éé已注åäºä»¶åçï¼è°ç¨Selector.select()å°é»å¡ï¼ç´å°æäºä»¶åç为æ¢ãå¦å¤ï¼å¯ä»¥è°ç¨ selectNow()æè select(long timeout)ãåè ç«å³è¿åï¼æ²¡æäºä»¶æ¶è¿å0å¼ï¼åè çå¾ timeoutæ¶é´åè¿åãä¸ä¸ªéæ©å¨æå¤å¯ä»¥åæ¶è¢«63个ééä¸èµ·æ³¨å使ç¨ã
åºç¨å®ä¾ï¼
ä¸é¢æ¯ç¨å¼æ¥è¾å ¥è¾åºæºå¶å®ç°ç客æ·/æå¡å¨å®ä¾ç¨åºï¿½D�Dç¨åºæ¸ å1ï¼éäºç¯å¹ ï¼åªç»åºäºæå¡å¨ç«¯å®ç°ï¼è¯»è å¯ä»¥åç §çå®ç°å®¢æ·ç«¯ä»£ç ï¼ï¼
1. public class NBlockingServer {
2. int port = 8000;
3. int BUFFERSIZE = 1024;
4. Selector selector = null;
5. ServerSocketChannel serverChannel = null;
6. HashMap clientChannelMap = null;//ç¨æ¥åæ¾æ¯ä¸ä¸ªå®¢æ·è¿æ¥å¯¹åºçå¥æ¥ååéé
7.
8. public NBlockingServer( int port ) {
9. this.clientChannelMap = new HashMap();
10. this.port = port;
11. }
12.
13. public void initialize() throws IOException {
14. //åå§åï¼åå«å®ä¾åä¸ä¸ªéæ©å¨ï¼ä¸ä¸ªæå¡å¨ç«¯å¯éæ©éé
15. this.selector = Selector.open();
16. this.serverChannel = ServerSocketChannel.open();
17. this.serverChannel.configureBlocking(false);
18. InetAddress localhost = InetAddress.getLocalHost();
19. InetSocketAddress isa = new InetSocketAddress(localhost, this.port );
20. this.serverChannel.socket().bind(isa);//å°è¯¥å¥æ¥åç»å®å°æå¡å¨æä¸å¯ç¨ç«¯å£
21. }
22. //ç»ææ¶éæ¾èµæº
23. public void finalize() throws IOException {
24. this.serverChannel.close();
25. this.selector.close();
26. }
27. //å°è¯»å ¥åèç¼å²çä¿¡æ¯è§£ç
28. public String decode( ByteBuffer byteBuffer ) throws
29. CharacterCodingException {
30. Charset charset = Charset.forName( âISO-8859-1â );
31. CharsetDecoder decoder = charset.newDecoder();
32. CharBuffer charBuffer = decoder.decode( byteBuffer );
33. String result = charBuffer.toString();
34. return result;
35. }
36. //çå¬ç«¯å£ï¼å½ééåå¤å¥½æ¶è¿è¡ç¸åºæä½
37. public void portListening() throws IOException, InterruptedException {
38. //æå¡å¨ç«¯éé注åOP_ACCEPTäºä»¶
39. SelectionKey acceptKey =this.serverChannel.register( this.selector,
40. SelectionKey.OP_ACCEPT );
41. //å½æ已注åçäºä»¶åçæ¶,select()è¿åå¼å°å¤§äº0
42. while (acceptKey.selector().select() > 0 ) {
43. System.out.println(âevent happenedâ);
44. //åå¾ææå·²ç»åå¤å¥½çææéæ©é®
45. Set readyKeys = this.selector.selectedKeys();
46. //使ç¨è¿ä»£å¨å¯¹éæ©é®è¿è¡è½®è¯¢
47. Iterator i = readyKeys.iterator();
48. while (i.hasNext()) {
49. SelectionKey key = (SelectionKey)i.next();
50. i.remove();//å é¤å½åå°è¦å¤ççéæ©é®
51. if ( key.isAcceptable() ) {//å¦ææ¯æ客æ·ç«¯è¿æ¥è¯·æ±
52. System.out.println(âmore client connect in!â);
53. ServerSocketChannel nextReady =
54. (ServerSocketChannel)key.channel();
55. //è·å客æ·ç«¯å¥æ¥å
56. Socket s = nextReady.accept();
57. //设置对åºçéé为å¼æ¥æ¹å¼å¹¶æ³¨åæå ´è¶£äºä»¶
58. s.getChannel().configureBlocking( false );
59. SelectionKey readWriteKey =
60. s.getChannel().register( this.selector,
61. SelectionKey.OP_READ|SelectionKey.OP_WRITE );
62. //å°æ³¨åçäºä»¶ä¸è¯¥å¥æ¥åè系起æ¥
63. readWriteKey.attach( s );
64. //å°å½å建ç«è¿æ¥ç客æ·ç«¯å¥æ¥åå对åºçééåæ¾å¨åå¸è¡¨//clientChannelMapä¸
65. this.clientChannelMap.put( s, new
66. ClientChInstance( s.getChannel() ) );
67. }
68. else if ( key.isReadable() ) {//å¦ææ¯éé读åå¤å¥½äºä»¶
69. System.out.println(âReadableâ);
70. //åå¾éæ©é®å¯¹åºçééåå¥æ¥å
71. SelectableChannel nextReady =
72. (SelectableChannel) key.channel();
73. Socket socket = (Socket) key.attachment();
74. //å¤ç该äºä»¶ï¼å¤çæ¹æ³å·²å°è£ å¨ç±»ClientChInstanceä¸
75. this.readFromChannel( socket.getChannel(),
76. (ClientChInstance)
77. this.clientChannelMap.get( socket ) );
78. }
79. else if ( key.isWritable() ) {//å¦ææ¯ééååå¤å¥½äºä»¶
80. System.out.println(âwriteableâ);
81. //åå¾å¥æ¥ååå¤çï¼æ¹æ³åä¸
82. Socket socket = (Socket) key.attachment();
83. SocketChannel channel = (SocketChannel)
84. socket.getChannel();
85. this.writeToChannel( channel,âThis is from server!â);
86. }
87. }
88. }
89. }
90. //对ééçåæä½
91. public void writeToChannel( SocketChannel channel, String message )
92. throws IOException {
93. ByteBuffer buf = ByteBuffer.wrap( message.getBytes() );
94. int nbytes = channel.write( buf );
95. }
96. //对ééç读æä½
97. public void readFromChannel( SocketChannel channel, ClientChInstance clientInstance )
98. throws IOException, InterruptedException {
99. ByteBuffer byteBuffer = ByteBuffer.allocate( BUFFERSIZE );
100. int nbytes = channel.read( byteBuffer );
101. byteBuffer.flip();
102. String result = this.decode( byteBuffer );
103. //å½å®¢æ·ç«¯ååºâ@exitâéåºå½ä»¤æ¶ï¼å ³éå ¶éé
104. if ( result.indexOf( â@exitâ ) >= 0 ) {
105. channel.close();
106. }
107. else {
108. clientInstance.append( result.toString() );
109. //è¯»å ¥ä¸è¡å®æ¯ï¼æ§è¡ç¸åºæä½
110. if ( result.indexOf( âânâ ) >= 0 ){
111. System.out.println(âclient inputâ+result);
112. clientInstance.execute();
113. }
114. }
115. }
116. //该类å°è£ äºææ ·å¯¹å®¢æ·ç«¯çééè¿è¡æä½ï¼å ·ä½å®ç°å¯ä»¥éè¿éè½½execute()æ¹æ³
117. public class ClientChInstance {
118. SocketChannel channel;
119. StringBuffer buffer=new StringBuffer();
120. public ClientChInstance( SocketChannel channel ) {
121. this.channel = channel;
122. }
123. public void execute() throws IOException {
124. String message = âThis is response after reading from channel!â;
125. writeToChannel( this.channel, message );
126. buffer = new StringBuffer();
127. }
128. //å½ä¸è¡æ²¡æç»ææ¶ï¼å°å½ååçªç½®äºç¼å²å°¾
129. public void append( String values ) {
130. buffer.append( values );
131. }
132. }
133.
134.
135. //主ç¨åº
136. public static void main( String[] args ) {
137. NBlockingServer nbServer = new NBlockingServer(8000);
138. try {
139. nbServer.initialize();
140. } catch ( Exception e ) {
141. e.printStackTrace();
142. System.exit( -1 );
143. }
144. try {
145. nbServer.portListening();
146. }
147. catch ( Exception e ) {
148. e.printStackTrace();
149. }
150. }
151. }
152.
å°ç»ï¼
ä»ä»¥ä¸ç¨åºæ®µå¯ä»¥çåºï¼æå¡å¨ç«¯æ²¡æå¼å ¥å¤ä½çº¿ç¨å°±å®æäºå¤å®¢æ·ç客æ·/æå¡å¨æ¨¡å¼ã该ç¨åºä¸ä½¿ç¨äºåè°æ¨¡å¼(CALLBACK)ï¼ç»å¿ç读è åºè¯¥æ©å°±çåºæ¥äºãéè¦æ³¨æçæ¯ï¼è¯·ä¸è¦å°åæ¥çè¾å ¥è¾åºå ä¸æ°å å ¥çè¾å ¥è¾åºå æ··ç¨ï¼å 为åºäºä¸äºåå çèèï¼è¿ä¸¤ä¸ªå 并ä¸å ¼å®¹ãå³ä½¿ç¨ééæ¶è¯·ä½¿ç¨ç¼å²å®æè¾å ¥è¾åºæ§å¶ã该ç¨åºå¨Windows2000,J2SE1.4ä¸ï¼ç¨telnetæµè¯æå
synchronizedçä¸ä¸ªç®åä¾å
public class TextThread
{
public static void main(String[] args)
{
// TODO èªå¨çææ¹æ³åæ ¹
TxtThread tt = new TxtThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}
class TxtThread implements Runnable
{
int num = 100;
String str = new String();
public void run()
{
while (true)
{
synchronized(str)
{
if (num>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.getMessage();
}
System.out.println(Thread.currentThread().getName()+ âthis is â+ numâ);
}
}
}
}
}
ä¸é¢çä¾åä¸ä¸ºäºå¶é ä¸ä¸ªæ¶é´å·®,ä¹å°±æ¯åºéçæºä¼,使ç¨äºThread.sleep(10)
Java对å¤çº¿ç¨çæ¯æä¸åæ¥æºå¶æ·±å大家çåç±ï¼ä¼¼ä¹çèµ·æ¥ä½¿ç¨äºsynchronizedå ³é®åå°±å¯ä»¥è½»æ¾å°è§£å³å¤çº¿ç¨å ±äº«æ°æ®åæ¥é®é¢ãå°åºå¦ä½ï¼ââè¿å¾å¯¹synchronizedå ³é®åçä½ç¨è¿è¡æ·±å ¥äºè§£æå¯å®è®ºã
æ»ç说æ¥ï¼synchronizedå ³é®åå¯ä»¥ä½ä¸ºå½æ°ç修饰符ï¼ä¹å¯ä½ä¸ºå½æ°å çè¯å¥ï¼ä¹å°±æ¯å¹³æ¶è¯´çåæ¥æ¹æ³ååæ¥è¯å¥åãå¦æåç»çåç±»ï¼synchronizedå¯ä½ç¨äºinstanceåéãobject referenceï¼å¯¹è±¡å¼ç¨ï¼ãstaticå½æ°åclass literals(ç±»å称åé¢å¸¸é)身ä¸ã
å¨è¿ä¸æ¥éè¿°ä¹åï¼æ们éè¦æç¡®å ç¹ï¼
Aï¼æ 论synchronizedå ³é®åå å¨æ¹æ³ä¸è¿æ¯å¯¹è±¡ä¸ï¼å®åå¾çéé½æ¯å¯¹è±¡ï¼èä¸æ¯æä¸æ®µä»£ç æå½æ°å½ä½éââèä¸åæ¥æ¹æ³å¾å¯è½è¿ä¼è¢«å ¶ä»çº¿ç¨ç对象访é®ã
Bï¼æ¯ä¸ªå¯¹è±¡åªæä¸ä¸ªéï¼lockï¼ä¸ä¹ç¸å ³èã
Cï¼å®ç°åæ¥æ¯è¦å¾å¤§çç³»ç»å¼éä½ä¸ºä»£ä»·çï¼çè³å¯è½é ææ»éï¼æ以尽éé¿å æ è°çåæ¥æ§å¶ã
æ¥çæ¥è®¨è®ºsynchronizedç¨å°ä¸åå°æ¹å¯¹ä»£ç 产ççå½±åï¼
å设P1ãP2æ¯åä¸ä¸ªç±»çä¸å对象ï¼è¿ä¸ªç±»ä¸å®ä¹äºä»¥ä¸å ç§æ åµçåæ¥åæåæ¥æ¹æ³ï¼P1ãP2å°±é½å¯ä»¥è°ç¨å®ä»¬ã
1ï¼ æsynchronizedå½ä½å½æ°ä¿®é¥°ç¬¦æ¶ï¼ç¤ºä¾ä»£ç å¦ä¸ï¼
Public synchronized void methodAAA()
{
//â¦.
}
è¿ä¹å°±æ¯åæ¥æ¹æ³ï¼é£è¿æ¶synchronizedéå®çæ¯åªä¸ªå¯¹è±¡å¢ï¼å®éå®çæ¯è°ç¨è¿ä¸ªåæ¥æ¹æ³å¯¹è±¡ãä¹å°±æ¯è¯´ï¼å½ä¸ä¸ªå¯¹è±¡P1å¨ä¸åç线ç¨ä¸æ§è¡è¿ä¸ªåæ¥æ¹æ³æ¶ï¼å®ä»¬ä¹é´ä¼å½¢æäºæ¥ï¼è¾¾å°åæ¥çææãä½æ¯è¿ä¸ªå¯¹è±¡æå±çClassæ产ççå¦ä¸å¯¹è±¡P2å´å¯ä»¥ä»»æè°ç¨è¿ä¸ªè¢«å äºsynchronizedå ³é®åçæ¹æ³ã
ä¸è¾¹ç示ä¾ä»£ç çåäºå¦ä¸ä»£ç ï¼
public void methodAAA()
{
synchronized (this) // (1)
{
//â¦..
}
}
(1)å¤çthisæçæ¯ä»ä¹å¢ï¼å®æçå°±æ¯è°ç¨è¿ä¸ªæ¹æ³ç对象ï¼å¦P1ãå¯è§åæ¥æ¹æ³å®è´¨æ¯å°synchronizedä½ç¨äºobject referenceãââé£ä¸ªæ¿å°äºP1对象éç线ç¨ï¼æå¯ä»¥è°ç¨P1çåæ¥æ¹æ³ï¼è对P2èè¨ï¼P1è¿ä¸ªéä¸å®æ¯«ä¸ç¸å¹²ï¼ç¨åºä¹å¯è½å¨è¿ç§æ å½¢ä¸æè±åæ¥æºå¶çæ§å¶ï¼é ææ°æ®æ··ä¹±ï¼ï¼
2ï¼åæ¥åï¼ç¤ºä¾ä»£ç å¦ä¸ï¼
public void method3(SomeObject so)
{
synchronized(so)
{
//â¦..
}
}
è¿æ¶ï¼éå°±æ¯soè¿ä¸ªå¯¹è±¡ï¼è°æ¿å°è¿ä¸ªéè°å°±å¯ä»¥è¿è¡å®ææ§å¶çé£æ®µä»£ç ãå½æä¸ä¸ªæç¡®ç对象ä½ä¸ºéæ¶ï¼å°±å¯ä»¥è¿æ ·åç¨åºï¼ä½å½æ²¡ææç¡®ç对象ä½ä¸ºéï¼åªæ¯æ³è®©ä¸æ®µä»£ç åæ¥æ¶ï¼å¯ä»¥å建ä¸ä¸ªç¹æ®çinstanceåéï¼å®å¾æ¯ä¸ä¸ªå¯¹è±¡ï¼æ¥å å½éï¼
class Foo implements Runnable
{
private byte[] lock = new byte[0]; // ç¹æ®çinstanceåé
Public void methodA()
{
synchronized(lock) { //⦠}
}
//â¦..
}
注ï¼é¶é¿åº¦çbyteæ°ç»å¯¹è±¡å建起æ¥å°æ¯ä»»ä½å¯¹è±¡é½ç»æµââæ¥çç¼è¯åçåèç ï¼çæé¶é¿åº¦çbyte[]对象åªé3æ¡æä½ç ï¼èObject lock = new Object()åéè¦7è¡æä½ç ã
3ï¼å°synchronizedä½ç¨äºstatic å½æ°ï¼ç¤ºä¾ä»£ç å¦ä¸ï¼
Class Foo
{
public synchronized static void methodAAA() // åæ¥çstatic å½æ°
{
//â¦.
}
public void methodBBB()
{
synchronized(Foo.class) // class literal(ç±»å称åé¢å¸¸é)
}
}
代ç ä¸çmethodBBB()æ¹æ³æ¯æclass literalä½ä¸ºéçæ åµï¼å®ååæ¥çstaticå½æ°äº§ççæææ¯ä¸æ ·çï¼åå¾çéå¾ç¹å«ï¼æ¯å½åè°ç¨è¿ä¸ªæ¹æ³ç对象æå±çç±»ï¼Classï¼èä¸åæ¯ç±è¿ä¸ªClass产ççæä¸ªå ·ä½å¯¹è±¡äºï¼ã
è®°å¾å¨ãEffective Javaãä¸ä¹¦ä¸çå°è¿å° Foo.classå P1.getClass()ç¨äºä½åæ¥éè¿ä¸ä¸æ ·ï¼ä¸è½ç¨P1.getClass()æ¥è¾¾å°éè¿ä¸ªClassçç®çãP1æçæ¯ç±Foo类产çç对象ã
å¯ä»¥æ¨æï¼å¦æä¸ä¸ªç±»ä¸å®ä¹äºä¸ä¸ªsynchronizedçstaticå½æ°Aï¼ä¹å®ä¹äºä¸ä¸ªsynchronized çinstanceå½æ°Bï¼é£ä¹è¿ä¸ªç±»çåä¸å¯¹è±¡Objå¨å¤çº¿ç¨ä¸åå«è®¿é®AåB两个æ¹æ³æ¶ï¼ä¸ä¼ææåæ¥ï¼å 为å®ä»¬çéé½ä¸ä¸æ ·ãAæ¹æ³çéæ¯Objè¿ä¸ªå¯¹è±¡ï¼èBçéæ¯Objæå±çé£ä¸ªClassã
å°ç»å¦ä¸ï¼
ææ¸ æ¥synchronizedéå®çæ¯åªä¸ªå¯¹è±¡ï¼å°±è½å¸®å©æ们设计æ´å®å ¨çå¤çº¿ç¨ç¨åºã
è¿æä¸äºæå·§å¯ä»¥è®©æä»¬å¯¹å ±äº«èµæºçåæ¥è®¿é®æ´å å®å ¨ï¼
1ï¼ å®ä¹private çinstanceåé+å®ç getæ¹æ³ï¼èä¸è¦å®ä¹public/protectedçinstanceåéãå¦æå°åéå®ä¹ä¸ºpublicï¼å¯¹è±¡å¨å¤çå¯ä»¥ç»è¿åæ¥æ¹æ³çæ§å¶èç´æ¥åå¾å®ï¼å¹¶æ¹å¨å®ãè¿ä¹æ¯JavaBeançæ åå®ç°æ¹å¼ä¹ä¸ã
2ï¼ å¦æinstanceåéæ¯ä¸ä¸ªå¯¹è±¡ï¼å¦æ°ç»æArrayListä»ä¹çï¼é£ä¸è¿°æ¹æ³ä»ç¶ä¸å®å ¨ï¼å 为å½å¤ç对象éè¿getæ¹æ³æ¿å°è¿ä¸ªinstance对象çå¼ç¨åï¼åå°å ¶æåå¦ä¸ä¸ªå¯¹è±¡ï¼é£ä¹è¿ä¸ªprivateåéä¹å°±åäºï¼å²ä¸æ¯å¾å±é©ã è¿ä¸ªæ¶åå°±éè¦å°getæ¹æ³ä¹å ä¸synchronizedåæ¥ï¼å¹¶ä¸ï¼åªè¿åè¿ä¸ªprivate对象çclone()ââè¿æ ·ï¼è°ç¨ç«¯å¾å°çå°±æ¯å¯¹è±¡å¯æ¬çå¼ç¨äºã