通过Lock对象的lock()和unlock()方法来模拟synchronized待模块。
1.Lock lock = new ReentrantLock();
2.ReadWriterLock rwl = new ReentrantReadWriterLock();是用来维护读取与写入分离的lock,同时可以有多个线程持有readlock,因为read通常是安全的并发操作;但只有一个线程可以持有write lock。
(if a thread has a write lock,nobody can have read/write lock.)
入口类:
package thread.test05;
public class LockTest {
public static void main(String[] args) {
MyStack stack=new MyStack(20);
Thread t1=new MyThreadA(stack);
Thread t2=new MyThreadB(stack);
t1.start();
t2.start();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(stack);
}
}
class MyThreadA extends Thread{
private MyStack stack;
public MyThreadA (MyStack stack){
this.stack=stack;
}
public void run(){
for(int i=0;i<10;i++){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
stack.push(i+"");
}
}
}
class MyThreadB extends Thread{
private MyStack stack;
public MyThreadB (MyStack stack){
this.stack=stack;
}
public void run(){
for(int i=0;i<10;i++){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
stack.push((char)('A'+i)+"");
}
}
}
MyStack类如下:
package thread.test05;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MyStack {
private Object[] data;
private int count;
private Lock lock;
public MyStack(int size){
data=new Object[size];
count=0;
lock=new ReentrantLock();
}
public void push(Object obj){
lock.lock();
try{
if(count==data.length){
throw new FullStackException("栈空间已满!");
}
data[count]=obj;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
finally{
lock.unlock();
}
}
public String toString(){
StringBuffer sb=new StringBuffer();
for(int i=0;i<count;i++){
sb.append(data[i]+",");
}
return sb.toString();
}
}
经测试,MyStack中的数据不会发生混乱。
//////////////////////////////////////////
读写锁:
package thread.test05;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class LockTest2 {
private final ReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
}
分享到:
相关推荐
Java Thread用法 经典Java Thread用法 经典
JavaThread
Java Thread Programming by:Paul Hyde java 线程编程(包含代码)
java thread dump 分析
java线程分析工具
为保证不会出现卖出同一个票数,要java多线程同步锁。 设计思路:1.创建一个站台类Station,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖...
Java-Thread-Affinity,将Java线程绑定到给定的内核.zip
IBM关于java thread的教程 .pdf
java 應用 thread 的小程式 計算 time 的
各种 Java Thread State 第一分析法则
Java Thread Dump Analyzing
Java线程转储分析: 《Analyzing Java Thread Dumps.pdf》 《Java Thread Dumps 分析.pdf》
Java线程(Java.Thread)(中英版).
Java Thread Programming (Sams) java线程编程,内含原代码,彩页,绝对写得精彩,看得舒服!
java线程
java.lang.Thread java.lang.Thread
本文从JVM的角度探讨Java Thread的语法和编译结果,本文旨在介绍这些比较重要的线程相关的规范。
Java_Thread应该注意的问题
基于java的thread章节做的龟兔赛跑,是一个小游戏。
用java swing 做的贪吃蛇 这里只提供 src包的源文件,运行时请建立自己的工程,并将src下的所有包添加到你的工程的src目录下,运行在main包下的main类