四种方式 sychronized关键字
sychronized method(){}
sychronized (objectReference) {/*block*/}
static synchronized method(){}
sychronized(classnameclass)
其中和是代表锁当前对象即一个对象就一个锁和代表锁这个类即这个类的锁
要注意的是sychronized method()不是锁这个函数而是锁对象即如果这个类中有两个方法都是sychronized那么只要有两个线程共享一个该类的reference每个调用这两个方法之一不管是否同一个方法都会用这个对象锁进行同步锁类的和类推即该类的不同reference调用了sychronized区段的咚咚就会受类锁的控制
还有如果两个函数调用的先后顺序不能被打断那么可以有个专门的锁对象来完成这个任务
class MyLock
{
synchronized getLock()
{
//####还没写完
}
}
五个等级 参见effective javaItem Document thread safety
immutable 不可变对象
threadsafe 线程安全的可以放心使用如javautilTimer
conditionally threadsafe 条件线程安全的如Vector和Hashtable一般是安全的除非存在几个方法调用之间的顺序不能被打断这时可以用额外的锁来完成
threadcompatible 可以使用synchronized (objectReference)来协助完成对线程的调用
threadhostile 不安全的
wait & notifyAll
在循环中使用wait 使用notifyAll而不是notify
pipe
java中也有pipe的四个类PipedInputStream PipedInputReader PipedOutputStream PipedOutputWriter 下面是一段生产者消费者的代码(摘自core javaII)
/* set up pipes */
PipedOutputStream pout = new PipedOutputStream();
PipedInputStream pin = new PipedInputStream(pout);
PipedOutputStream pout = new PipedOutputStream();
PipedInputStream pin = new PipedInputStream(pout);
/* construct threads */
Producer prod = new Producer(pout);
Filter filt = new Filter(pin pout);
Consumer cons = new Consumer(pin);
/* start threads */
prodstart(); filtstart(); consstart();