1、锁 Lock比synchronized更加面向对象,
用户互斥实现类 ReentrantLock:互斥锁
2、读写锁
锁示例
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author Administrator @zsw 2012-7-20 下午04:24:02
*/
public class LockTest {
public static void main(String[] args) {
new LockTest().init();
}
public void init() {
final Outputer outputer = new Outputer();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputer.output("zhangshiwei");
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputer.output("tianxia");
}
}
}).start();
}
class Outputer {
// 做一把锁
Lock lock = new ReentrantLock();
public void output(String name) {
int len = name.length();
// 上锁
lock.lock();
try {
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 无论如何,都要解锁
lock.unlock();
}
}
}
}
读写锁示例
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author Administrator @zsw 2012-7-20 下午04:50:52
*/
public class ReadWriteLockTest {
public static void main(String[] args) {
final Queue q = new Queue();
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
q.get();
}
}
}).start();
}
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
q.put(new Random().nextInt(1000));
}
}
}).start();
}
}
}
class Queue {
private Object data = null;// 共享数据,只能有一个线程同时写它,但是可以多个线程同时读它
ReadWriteLock rwl = new ReentrantReadWriteLock(); // 读写锁:上面有一个读锁和一个写锁
public void get() {
rwl.readLock().lock();//上读锁
try {
System.out.println(Thread.currentThread().getName()
+ " be ready to read data: " + data);
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()
+ " hava read data: " + data);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
rwl.readLock().unlock();
}
}
public void put(Object data) {
rwl.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName()
+ " br ready to write data: " + data);
Thread.sleep(1000);
this.data=data;
System.out.println(Thread.currentThread().getName()
+ " have write data: " + this.data);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
rwl.writeLock().unlock();
}
}
}