解决方案 »
- 高分求代码,熟悉图形化界面的高手请!!分不够再加!!
- 有没有什么办法知道一个Map占了多少内存?
- 简单的一个JSP程序怎么在别人电脑(当服务器)发布
- 十六进制to十进制?
- 关于模式的疑惑
- [200分]关于throws和throw和try{}catch(){}的区别和联系,书本上也说的迷迷糊糊,他们中的三种不知什么时候该使用!详细如下:
- 关于compareTo Comparator两个接口的个问题?急,,,just 结分
- 图片路径问题
- 要从一个类里访问另一个类里的组件或变量应怎么办?
- 刚学完面对对象和Api适合做什么小项目 求大神指点
- java 最接近点对 栈溢出error
- java 修改windows Linux 系统时间
百度了一下 结果是这样的:
一、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){/*区块*/}是区块作用域的同步。
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;
}
}