一,关于线程安全的类
StringBufffer
线程安全,可变的字符序列
从版本JDK 5开始,被StringBuilder替代。通常应该使用StringBuilder类,因为它支持所有相同的操作,但它更快,因为它不执行同步
Vector
从Java 2平台v1.2开始,该类改进了List接口,使其成为JavaCollections Framework的成员。
与新的集合实现不同,Vector被同步。如果不需要线程安全的实现,建议使用ArrayListf代替Vector
Hashtable
该类实现了一个哈希表。它将键映射到值。任何非null对象都可以用作键或者值
从Java 2平台v1.2开始,该类进行了改进,实现了Map接口,使其成为JavaCollections Framework的成员。
与新的集合实现不同,Hashtable被同步。如果不需要线程安全的实现,建议(使用HashMap代替Hashtable
现在后两个可以用Collections工具类的synchronizedList方法与synchronizedMap方法代替当然还有synchronizedSet
二,Lock锁
1、我们并没有直接看到同步代码块和同步方法的锁对象在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock
2、Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作Lock中提供了获得锁和程放锁的方法
| 方法 | 描述 |
| void lock() | 获得锁 |
| void unlock() | 释放锁 |
Lock是接口不能直接实例化,这里采用它的实现类Reentrantlock来实例化ReentrantLock的构造方法ReentrantLock()创建一个ReentrantLock的实例
下面是我做的练习,还是卖票
LockClass类
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockClass implements Runnable{
private int number=100;
// 创建锁对象,多态方式
private Lock lock=new ReentrantLock();
@Override
public void run() {
while(true){
try {
lock.lock();
if(number>0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖出一张票,还剩下"+(number-1)+"张票。");
number--;
}
}finally {
lock.unlock();
}
}
}
}
测试类
public class LockTest {
public static void main(String[] args) {
LockClass lc=new LockClass();
Thread thread1=new Thread(lc,"窗口1");
Thread thread2=new Thread(lc,"窗口2");
Thread thread3=new Thread(lc,"窗口3");
thread1.start();
thread2.start();
thread3.start();
}
}



