java多线程系列文章:
java多线程(一):synchronized 对象锁和类锁的区别
java多线程(二): wait()、sleep()、 join()和yield()区别
这章博客讲解lock如何实现同步机制,比较和synchronized 的区别:
JDK1.5中新增加了ReentrantLock类也能达到synchronized 同样的效果,并且在扩展功能上也更加强大,比如具有嗅探锁定、多路分支通知等功能,而且在使用上也比synchronized更加灵活。
1.使用ReentrantLock实现对象锁:
package lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
private Lock lock = new ReentrantLock();
public void getMessage() {
lock.lock();
try {
for (int i = 0; i < 10; i++) {
System.out.println("线程:" + Thread.currentThread().getName()
+ ",getMessage" + i);
}
} catch (Exception e) {
// TODO: handle exception
} finally {
lock.unlock();
}
}
}
创建Test类, lock.lock()获取对象锁, lock.unlock()释放对象锁
package lock;
public class MyThread extends Thread{
static Test test = new Test();
@Override
public void run() {
test.getMessage();
}
}
我们继承Thread类,MyThread拥有一个静态的成员变量Test ,这样做事为了确保不同的线程执行run()的时候都是调用同一个Test对象,最后在主函数中创建俩个线程:
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.start();
t2.start();
}
输出结果:
线程:Thread-0,getMessage0
线程:Thread-0,getMessage1
线程:Thread-0,getMessage2
线程:Thread-0,getMessage3
线程:Thread-0,getMessage4
线程:Thread-0,getMessage5
线程:Thread-0,getMessage6
线程:Thread-0,getMessage7
线程:Thread-0,getMessage8
线程:Thread-0,getMessage9
线程:Thread-1,getMessage0
线程:Thread-1,getMessage1
线程:Thread-1,getMe