远程桌面登陆 package jsp 状态模式 facebook vue表单 click事件 jquery遍历对象 js回调函数写法 郑州普通话 python取随机数 python用什么数据库 java开发教程 java运算 java中的数据结构 java取当前时间 java比较字符串 linux系统命令大全 js正则匹配字符串 vue引入第三方js kz文件 sai怎么复制图层 微信小程序循环 机械键盘怎么关闭灯光 人物建模教程 ps二寸照片制作教程 ibeacon定位 img转iso 剪影的意思 正则表达式java 雷达图怎么做 97大门出招表 apk提取 mdb文件用什么打开 换肤软件 word绘图工具 docker卸载 x平均值符号怎么打出 verifycode itunes备份密码神器
当前位置: 首页 > 学习教程  > 编程语言

java中线程的知识07---Reentrantlock

2021/1/28 23:34:10 文章标签:

在Java多线程中,可以使用synchronized关键字来实现线程之间的同步互斥,但在JDK1.5中新增加ReentranLock类也可以达到同样的效果,并且在扩展功能上更加强大,比如具有嗅探锁定、多路分支通知等,而且在使用上也比synchron…

在Java多线程中,可以使用synchronized关键字来实现线程之间的同步互斥,但在JDK1.5中新增加ReentranLock类也可以达到同样的效果,并且在扩展功能上更加强大,比如具有嗅探锁定、多路分支通知等,而且在使用上也比synchronized更加灵活。

代码测试片段一:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Demo002 {
    public static void main(String[] args) {
        Thread t1 = new DemoThread002();
        Thread t2 = new DemoThread002();
        t1.start();
        t2.start();
    }
}

class DemoThread002 extends Thread{
    @Override
    public void run() {
        for (int i=0;i<5;i++){
            System.out.println(Thread.currentThread().getName()+","+(i+1));
        }
    }
}

输出结果如下,没有顺序:

Thread-1,1
Thread-0,1
Thread-1,2
Thread-0,2
Thread-0,3
Thread-1,3
Thread-1,4
Thread-0,4
Thread-1,5
Thread-0,5

代码测试片段二:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Demo001 {
    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Thread t1 = new DemoThread001(lock);
        Thread t2 = new DemoThread001(lock);
        t1.start();
        t2.start();
    }
}

class DemoThread001 extends Thread{
    private Lock lock;
    public DemoThread001(Lock lock){
        this.lock = lock;
    }
    @Override
    public void run() {
        lock.lock();
        for (int i=0;i<5;i++){
            System.out.println(Thread.currentThread().getName()+","+(i+1));
        }
        lock.unlock();
    }
}

输出结果如下,有顺序:

Thread-0,1
Thread-0,2
Thread-0,3
Thread-0,4
Thread-0,5
Thread-1,1
Thread-1,2
Thread-1,3
Thread-1,4
Thread-1,5

代码测试片段三:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Demo001 {
    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Thread t1 = new DemoThread001(lock);
        Thread t2 = new DemoThread001(lock);
        Thread t3= new DemoThread001(lock);
        t1.start();
        t2.start();
        t3.start();
    }
}

class DemoThread001 extends Thread{
    private Lock lock;
    public DemoThread001(Lock lock){
        this.lock = lock;
    }
    @Override
    public void run() {
        lock.lock();
        for (int i=0;i<5;i++){
            System.out.println(Thread.currentThread().getName()+","+(i+1));
        }
        lock.unlock();
    }
}

输出结果如下:

Thread-0,1
Thread-0,2
Thread-0,3
Thread-0,4
Thread-0,5
Thread-2,1
Thread-2,2
Thread-2,3
Thread-2,4
Thread-2,5
Thread-1,1
Thread-1,2
Thread-1,3
Thread-1,4
Thread-1,5

重要结论:从运行结果来看,当前线程打印完毕之后将会对锁进行释放,其它线程才可以继续 打印。线程打印的数组是分级打印,因为当前线程已经持有锁,但线程之间打印的顺序是随机的。
 

 

 


本文链接: http://www.dtmao.cc/news_show_650240.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?