本帖最后由 askquestion_003 于 2012-03-06 19:29:06 编辑

解决方案 »

  1.   

    LZ这个问题我也想知道
    百度了一下 结果是这样的:
    一、synchronized关键字的作用域有二种:
    1.是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的 synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
    2.是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。二、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;三、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;总结:synchronized aMethod(){}是对象作用域的方法同步;static synchronized aMethod(){}是类作用域的方法同步;synchronized(this){/*区块*/}是区块作用域的同步。
      

  2.   

    你这样写我感觉是不对的,因为每次线程调用的时候都新建了一个book对象,所以这样测试都能运行!我感觉是,希望探讨!!!!!!!!
      

  3.   

    BookHelper.getBook()如果是单例,就所有的都不能进synchronized,否则每次每个对象锁定的都是新的book就没有线程同步问题了。
      

  4.   

    这个就要看setAuthor方法是不是synchronized,如果是,就会在codeA处等待,如果不是,就会执行codeA,继续codeB,直到synchorized(book)为止发生等待(前提是codeC线程没有离开codeC的synchronized(book)代码块)
      

  5.   

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

  6.   

    synchronized 定义的方法或者程序代码块执行时候其他后面想执行这段代码的线程将要排队。其目的是为了防止线程共享资源时候因线程不同步而产生意外的结果,在synchronized 方法或代码块中的资源保持在同一时间只能有一个对象使用。
      

  7.   

    补充说明:Book book = BookHelper.getBook();每次返回的都是同一个对象