首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

synchronized作用域的有关问题?

2012-03-25 
synchronized作用域的问题???Java codepublic void function(){Book book BookHelper.getBook().....bo

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;
}
}

热点排行