java 中的 synchronized
synchronized: 同步的
synchronized在操作上有两种影响对象的情况:
1) 在某个对象实例内,synchronized method(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
2) 在某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。
除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;
synchronized关键字是不能继承的,也就是说,基类的方法synchronized method(){} 在继承类中并不自动是synchronized method(){},而是变成了method(){}。继承类需要你显式的指定它的某个方法为synchronized方法;
无论synchronized关键字加在方法上还是对象上,他取得的锁都是对象锁,而不是把一段代码或函数锁定,不能被别的对象访问,同一个类中的同一个方法会在该类的不同对象上被其他线程的对象访问。
每个对象只有一把锁(lock)和它相关联。
实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
但当没有明确的对象需要锁定,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:
class Foo implements Runnable {
private byte[] lock = new byte[0]; // 特别的instance变量
Public void method() {
synchronized(lock) { //… }
}
//…
}
零长度的byte数组对象创建起来将比任何对象都经济,编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。
class Foo {
public void method() {
&
相关文档:
Java线程:线程的同步-同步块
对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。
追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能。
&nb ......
Java线程:并发协作-生产者消费者模型
对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,Hello World!都是最经典的例子。
实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。
对于此模 ......
Java线程:新特征-线程池
Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要。
有关Java5线程新特征的内容全部在java.util ......
输入输出流
在Java中,我们把能够读取一个字节序列的对象称作一个输入流;而我们把够写一个字节序列称作一个输出流。它们分别由抽象类 InputStream和OutputStream类表示。因为面向字节的流不方便用来处理存储为Unicode(每个字符使用两个字节)的信息。所以Java引入了用来处理Unicode字符的类层次,这些类派生自抽象类Reade ......
6.1 基本数据类型
传授新知
在Java语言中,数据类型可以分为两大类:
1)基本类型;
2)扩展类型。
在本小节中,我们就一起来学习一下Java语言的基本数据类型。它包括:boolean、char、byte、int、short、long、float、double八种:
类型 描述 取值范围
Boolean 布尔型 只有两个值t ......