synchronized和ReentrantLock的区别
ReentrantLock 的lock机制有2种,忽略中断锁和响应中断锁,这给我们带来了很大的灵活性。比如:如果A、B2个线程去竞争锁,A线程得到了锁,B线程等待,但是A线程这个时候实在有太多事情要处理,就是 一直不返回,B线程可能就会等不及了,想中断自己,不再等待这个锁了,转而处理其他事情。这个时候ReentrantLock就提供了2种机制,第一,B线程中断自己(或者别的线程中断它),但是ReentrantLock 不去响应,继续让B线程等待,你再怎么中断,我全当耳边风(synchronized原语就是如此);第二,B线程中断自己(或者别的线程中断它),ReentrantLock 处理了这个中断,并且不再等待这个锁的到来,完全放弃。请看例子:
/**
* @version 0.10 2009-11-6
* @author Zhang Hua
*/
public class Test {
//是用ReentrantLock,还是用synchronized
public static boolean useSynchronized = false;
public static void main(String[] args) {
IBuffer buff = null;
if(useSynchronized){
buff = new Buffer();
}else{
buff = new BufferInterruptibly();
}
final Writer writer = new Writer(buff);
final Reader reader = new Reader(buff);
writer.start();
reader.start();
new Thread(new Runnable() {
public void run() {
long start = System.currentTimeMillis();
for (;;) {
// 等5秒钟去中断读
if (System.currentTimeMillis() - start > 5000) {
System.out.println("不等了,尝试中断");
reader.interrupt();
break;
}
}
}
}).start();
}
}
interface IBuffer{
public void write();
public void read() throws InterruptedException;
}
class Buffer implements IBuffer{
private Object lock;
public Buffer() {
lock = this;
}
public void write() {
synchronized (lock) {
long startTime = System.currentTimeMillis();
System.out.println("开始往这个buff写入数据…");
for (;;)// 模拟要处理很长时间
{
if (System.currentTimeMillis() - startTime > Integer.MAX_VALUE)
break;
}
System.out.println("终于写完了");
}
}
public void read() {
synchronized (lock) {
System.out.println("从这个buff读数据");
}
}
}
class BufferInterruptibly implements IBuffer{
private ReentrantLock lock = new ReentrantLock();
public void write() {
lock.lock();
try {
long startTime = System.currentTimeMillis();
System.out.println("开始往这个buff写入数据…");
for (;;)// 模拟要处理很长时间
{
if (System.currentTimeMillis() - startTime > Integer.MAX_VALUE)
break;
}
System.out.println("终于写完了");
} finally {
lock.unlock();
}
}
public void read() throws InterruptedException{
lock.lockInterruptibly();// 注意这里,可以响应中断
try {
System.out.println("从这个buff读数据");
} finally {
lock.unlock();
}
}
}
class Writer extends Thread {
private IBuffer buff;
public Writer(IBuffer buff) {
this.buff = buff;
}
@Override
public void run() {
buff.write();
}
}
class Reader extends Thread {
private IBuffer buff;
public Reader(IBuffer buff) {
this.buff = buff;
}
@Override
public void run() {
try {
buff.read();
} catch (InterruptedException e) {
System.out.println("我不读了");
}
System.out.println("读结束");
}
}
Thread和Runable的区别,Synchronized锁关键字
synchronize的中文意思:
vi.
同时化,同时发生[举行] (with) (几个钟表)指示同一时刻;物理学同步,整步;**声、像同步化,同步录音。
vt.
1.使同时;物理学使同[整]步。
2.校准,对准(钟表)。
3.同时处理,综合对照表示(历史事件);影、电视使声像一致;作同时[步]录音处理。
扩展知识:
1、synchronize例句与用法
The film does not?synchronize?with sound .
该影片画面与声音不同步。
2、Synchronized?blinker lights are set up in new york and san francisco .
两盏同步的闪光灯分别设在纽约和旧金山。
3、The?synchronized?low-frequency rectifier is similar to a push-pull rectifier .
同步低频整流器与推挽整流器相似。
4、Their operation must be?synchronized?with the operations of the existing furnaces .
这种操作必须同现有的高炉设备的运转同时进行。
5、For generations successive administrations had?synchronized?their moves with london .
几十年,历届政府与伦敦的行动步调都是一致的。
一、Thread和Runable的区别
1.Thread是基类,子类必继承他实现其run方法。其也是实现了Runable接口。Thread是普通的类,并非抽象类或者密封类等。
2.Runnable是接口,子类必须实现run方法,该接口就只有唯一的抽象方法run。
3.由于Java单继承,所以Thead通过类继承方式实现接口,存在扩展性问题。
4.他们都是通过start方法来启动,可以达到异步操作,如果用run方法启动其将是同步方法,失去多线程的意义。
5.Runnable,的实现类可以实现资源共享,多个调用只需要实例化Runnable的一个实例,然后将其放到 new Thread(new Runnable实现类).start方法(可以new多个一样的即表示多个线程),启动。
6.实验发现在实现Runnable的多线程中,如果同时启动的实例过多会在第一次执行的时候出现多线程并发,主要出现在开始,有肯能是程序启动加载资源导致,大多度数时候还是稳定的。比如实现的run方法控制了10个实际new 的个数太多久会出现,但是频率不高。
7.可以在Thread中实现匿名方法也可以实现多线程异步华。
8.主线程结束,子线程可以继续执行。
9.在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。
二、Synchronized
1.Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
2.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
3.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
4.尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
5.第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
6.以上规则对其它对象锁同样适用。
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!