package cn.itcast.heima2;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockTest {
public static void main(String[] args) {
final Outputerr outputerr = new Outputerr();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputerr.output("wangwu");
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputerr.output("lisi");
}
}
}).start();
}
}
class Outputerr{
Lock lock = new ReentrantLock();
public void output(String name){
int len = name.length();
//synchronized (Outputer.class) {
lock.lock();//使用锁进行同步,取代synchronized关键字
try {
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();
} finally {
lock.unlock();//}
}
}
}
读写锁
package cn.itcast.heima2;
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockTest {
public static void main(String[] args) {
final Queue3 queue = new Queue3();
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
queue.get();//3个读线程
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
queue.put(new Random().nextInt(10000));//3个写线程
}
}
}).start();
}
}
}
class Queue3{
private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据
ReadWriteLock rwLock = new ReentrantReadWriteLock();//读写锁
public void get(){
rwLock.readLock().lock();//获得读锁
try {
System.out.println(Thread.currentThread().getName() + " be ready to read data!");
Thread.sleep((long)(Math.random()*1000));
System.out.println(Thread.currentThread().getName() + " have read data:" + data);
} catch (InterruptedException e) {
e.printStackTrace();
} finally{
rwLock.readLock().unlock();//释放读锁
}
}
public void put(Object data){
rwLock.writeLock().lock();//获得写锁
try {
System.out.println(Thread.currentThread().getName() + " be ready to write data!");
Thread.sleep((long)(Math.random()*1000));
this.data = data;
System.out.println(Thread.currentThread().getName() + " have write data:" + data);
} catch (InterruptedException e) {
e.printStackTrace();
} finally{
rwLock.writeLock().unlock();//释放写锁
}
}
}