日期:2014-05-20  浏览次数:20676 次

synchronized作用域的问题???
Java code

public void function(){
   Book book = BookHelper.getBook();
   .....
   book.setAuthor(authorObj);//code A
   ....
   //code B
   synchronized(book){
      ....
      //code C
      ....
   }
   ....
}


请问当一个线程进入code C后
第二个线程能进入到code A处么?(我之所以问是因为觉得book的引用被synchronized了)
还是说能运行到code B处才等待?

------解决方案--------------------
BookHelper.getBook()如果是单例,就所有的都不能进synchronized,否则每次每个对象锁定的都是新的book就没有线程同步问题了。
------解决方案--------------------
这个就要看setAuthor方法是不是synchronized,如果是,就会在codeA处等待,如果不是,就会执行codeA,继续codeB,直到synchorized(book)为止发生等待(前提是codeC线程没有离开codeC的synchronized(book)代码块)
------解决方案--------------------
setAuthor如果是synchronized方法,不能,否则可以。我写了个例子测试过了,你可以参考下,期中
setBookName方法加与不加synchronized结果相反。
package com.test;
public class temp {
public static void main(String[] args) {
Book book = new Book();
TT tt = new TT(book);
DD dd = new DD(book);
tt.start();
dd.start();
}
}
class TT extends Thread{
private Book book;
public TT(Book b){
book = b;
}
@Override
public void run() {
synchronized(book){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("synchronized");
}
}
}
class DD extends Thread{
private Book book;
public DD(Book b) {
book = b;
}
@Override
public void run() {
book.setBookName("DD thread");
System.out.println(book.getBookName());
}
}
class Book {
private String bookName ;
public Book(){
bookName="";
}
public String getBookName() {
return bookName;
}
public synchronized void setBookName(String bookName) { //synchronized 
this.bookName = bookName;
}
}