首页 > 代码库 > Java

Java

要注意ClassInstance == XXX 的情况,如果ClassInstance是基本数据类型的封装类且为null,会产生空指针错误。

Boolean对象就出现了这个问题,可能是基本数据类型的封装类会调用valueOf()

Wait/notify

wait()方法表示,放弃当前对资源的占有权,等啊等啊,一直等到有人通知我,我才会运行后面的代码。
notify()方法表示,当前的线程已经放弃对资源的占有,通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复,然后继续运行wait()后面的语句;notifyAll()方法表示,当前的线程已经放弃对资源的占有,通知所有的等待线程从wait()方法后的语句开始运行。

Sychronized

在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。java的wait吊起线程的时候会释放synchronized锁。所以可以同时在wait和notifyAll的两个不同代码块中使用synchronized。

1,修饰函数

public synchronized void accessVal(int newVal);
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。

2,修饰代码段

synchronized(syncObject) {

//允许访问控制的代码
}

其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行。

 

当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的除synchronized(this)同步代码块以外的部分。

一般来说,需要保护的都是static的数据,因为它们可以被不同的线程所访问。还有就是几个线程共有一个实例的情况,需要sychronized保护。

Thread

可以传入Runnable来实例化Thread,在runnable中也可通过Thread.currentThread()获取所属的Thread实例。

Thread.interrupt()

要中断Thread,只能使用Thread.interrupt()方法使线程受到阻塞时抛出一个中断信号。

真正要实现中断,还需要对这个中断信号进行处理:

1,捕获异常。因为block的线程(sleep() or join())在被调用interrupt时会产生InterruptException,可以捕获该异常来决定是否中断。如果不处于block状态,不会抛出异常,直到block。

2,使用Thread.interrupted()判断是否收到中断信号。

Thread.yield()

暂停当前正在执行的线程对象,并执行其他线程。

注意:这里的其他也包含当前线程。

Thread.sleep(long millis)

使当前线程暂停millis所指定的毫秒,转到执行其它线程。

Thread.join()

先start()执行线程,然后join(),使join()后面的代码要等线程执行完再运行

Java