synchronized和Lock有什么区别?用新的Lock有什么好处?多线程之间按顺序调用,实现A->B->C三个线程启动,要求如下: AA打印5次,BB打印10次,CC打印15次,循环10次

**

区别:

**

1.原始构成:

synchronized: synchronized是Java关键字,属于JVM层面。(monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法)也依赖于monitor对象只有在同步块或方法中才能调wait/notify等方法。)

Lock: 是具体类(java.util.concurrent.locks.Lock)是api层面的锁。

2.使用方法的区别:

synchronized: 不需要用户手动去释放锁,当synchronized代码执行完后系统会自动让线程释放对锁的占用。

Lock: ReentrantLock则需要用户去手动释放锁,若没有主动释放锁,就有可能导致出现死锁。需要lock()和unlock()方法配合try/finally语句块来完成。

3.等待是否可中断:

sychronized : 不可中断,除非抛出异常或者正常运行完成

ReentrantLock:可中断,

  • 1.设置超时方法 tryLock(long timeout,TimeUnit unit)

  • 2.lockInterruptibly()放在代码块中,调用interrupt()方法可中断。

4.加锁是否公平

synchronized: 非公平锁。
ReentrantLock: 两者都可以,默认非公平锁,构造方法可以传入boolean值,true为公平锁,false为非公平锁。

5.锁绑定多个条件Condition

synchronized: 没有
ReentrantLock: 用来实现分组唤醒需要唤醒的线程们,可以精确唤醒,而不是像synchronized要么随机唤醒一个线程,要么唤醒全部线程。

Lock的好处:

Lock可以实现精确唤醒,(当然synchronized也可以,可是想实现起来太麻烦。)

这里举一个小Demo: 多线程之间按顺序调用,实现A->B->C三个线程启动,要求如下:

AA打印5次,BB打印10次,CC打印15次,紧接着 :AA打印5次,BB打印10次,CC打印15次…来10轮。。代码很套路,看会一个方法就行。

class ShareResource{
    private int number = 1; //A:1   B:2     C:3
    private Lock lock = new ReentrantLock();

    private Condition c1 = lock.newCondition();
    private Condition c2 = lock.newCondition();
    private Condition c3 = lock.newCondition();


    public void print5() {

        lock.lock();
        try
        {
            //1   判断
            while (number != 1) {

                c1.await();

            }
            //2   干活
            for (int i = 1; i <= 5; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i);
            }
            //3   通知2号
            number = 2;
            c2.signal();

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            lock.unlock();
        }
    }

    public void print10() {

        lock.lock();
        try
        {
            //1   判断
            while (number != 2) {

                c2.await();

            }
            //2   干活
            for (int i = 1; i <= 10; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i);
            }
            //3   通知3号
            number = 3;
            c3.signal();

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            lock.unlock();
        }
    }
    public void print15() {

        lock.lock();
        try
        {
            //1   判断
            while (number != 3) {

                c3.await();

            }
            //2   干活
            for (int i = 1; i <= 15; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + i);
            }
            //3   通知1号
            number = 1;
            c1.signal();

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            lock.unlock();
        }
    }



}

public class SyncAndReen {
    public static void main(String[] args) {

        ShareResource shareResource = new ShareResource();

        new Thread(() -> {

            for (int i = 1; i < 10; i++) {
                shareResource.print5();
            }
                },"A").start();


        new Thread(() -> {

            for (int i = 1; i < 10; i++) {
                shareResource.print10();
            }
        },"B").start();


        new Thread(() -> {

            for (int i = 1; i < 10; i++) {
                shareResource.print15();
            }
        },"C").start();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
〖程序设计基础〗练习题1一、选择题(每题1分,共30分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项的标记写在题干后的括号内。1.以下的选项中能正确表示Java语言中的一个整型常量的是( )。A) 12. B) -20 C) 1,000 D) 4 5 62.以下选项中,合法的赋值语句是( )。A) a = = 1; B) ++ i; C) a=a + 1= 5; D) y = int ( i );3.若所用变量都已正确定义,以下选项中,非法的表达式是( )。A) a != 4||b==1 B) 'a' % 3 C) 'a' = 1/2 D) 'A' + 324.若有定义int a = 2;则执行完语句a += a -= a * a; 后,a的值是( )。A) 0 B) 4 C) 8 D) -45.设有定义语句int a[]={66,88,99}; 则以下对此语句的叙述错误的是( )。A) 定义了一个名为a的一维数组 B) a数组有3个元素C) a数组的下标为1~3 D)数组中的每个元素是整型6.若a和b均是整型变量并已正确赋值,正确的switch语句是( )。A) switch(a+b); B) switch( a+b*3.0 ){ ...... } { ...... }C) switch a D) switch ( a%b ){ ...... } { ...... }7.下列语句序列执行后,x 的值是( )。int a=3, b=4, x=5;if( ++aA) 5 B) 3 C) 4 D) 68.下列语句序列执行后,k 的值是( )。int i=6, j=8, k=10, n=5, m=7;if( iA) 9 B) 10 C) 11 D) 129.下列语句序列执行后,r 的值是( )。char ch='8'; int r=10;switch( ch+1 ){ case '7': r=r+3;case '8': r=r+5;case '9': r=r+6; break;default: ;}A) 13 B) 15 C) 16 D) 1010.下列语句序列执行后,j 的值是( )。int j=0;for( int i=3; i&gt;0; i-- ) j+=i;A) 3 B) 4 C) 5 D) 611.下列语句序列执行后,j 的值是( )。int j=9, i=6;while( i-- &gt;3 ) --j;A) 5 B) 6 C) 7 D) 812.下列语句序列执行后,i的值是( )。int i=10;do { i-=2; } while( i&gt;6 );A) 10 B) 8 C) 6 D) 413.为了区分重载多态中同名的不同方法,要求( )。A) 采用不同的形式参数列表 B) 返回值类型不同 C) 调用时用类名或对象名做前缀 D) 参数名不同14.定义主类的类头时可以使用的访问控制符是( )。A) private B) protected C) public D) private protected15.下列整型的最终属性 i 的定义中,正确的是( )。A) static final int i=100; B) final i;C) static int i; D) final float i=1.2f; 16.设 x,y 均为已定义的类名,下列声明对象x1的语句中正确的是( )。A) public x x1= new y( ); B) x x1=x( ); C) x x1=new x( ); D) int x x1;17.下列方法定义中,正确的是( )。A) int x( int a,b ) B) double x( int a,int b){ return (a-b); } { int w; w=a-b; }C) double x( a,b ) D) int x( int a,int b){ return b; } { return a-b; }18.能构成多分支的语句是( )。A) for 语句 B) while 语句 C) switch 语句 D) do -
##KodExplorer (http://kalcaddle.com/) ###ver2.61(2014.7.12) `商业版授权请联系:kalcaddle#qq.com` #### 1.是什么: - Kodexplorer为千帆网络工作室开发的一款服务器文件管理程序。 - 完美取代FTP管理:可用于服务器文件管理,zip解压缩 备份还原、支持图片、音乐、视频预览、office、pdf等格式在线预览。文件夹拖拽上传……。 - 在线编程:支持几乎所有编程语言的在线编辑(高亮,多光标编辑.堪比本地的sublime) - 极佳的操作体验:及其便捷的快捷键支持,让你拥有本地化的体验 - 中文等多语言支持:中文编码全面兼容,文件编辑自动适配。 - 超快的速度:全面采用Ajax+Json进行数据通信,毫秒级的响应速度; - 全平台兼容性:Win Linux Mac (Apache、Nginx、IIS) #### 2.使用场景: - 取代FTP,服务端、客户端软件等复杂的安装配置。kod可以一键安装随处使用. - 你可以用它来管理你的服务器(备份,在线解压缩,版本发布....) - 你可以把他当做管理linux的一个操作系统界面 - 可以用来作为私有云存储系统,存储你的文件... - 当然你也可以用来分享文件 - Web IDE / browser code editor awesomeness - 更多场景等你来挖掘!…… #### 3.使用说明 管理员: admin/admin 普通用户:demo/demo 游客用户:guest/guest [如何使用] 下载程序,解压上传到你的服务器路径下,data目录设置777权限。访问体验超便捷的服务吧! (data目录没有写权限会导致配置修改不能保存、不能建用户等) [关于上传问题] 程序没有做任何限制,如果需要上传大文件,则修改 php.ini:`upload_max_filesize = 1000M post_max_size = 1000M` [关于解压缩问题] 程序不做任何限制,如若失败请设置php内存限制。memory_limit 1000M [关于兼容性] 建议使用chrome firefox ie9+ 体验更完整。ie8以下基本上不做兼容处理。chrome支持文件夹拖拽上传。 [文件打开] office文件在线预览功能,服务器必须在公网(外部能访问该服务器) [忘记密码] 修改data/system/member.php 密码为明文的md5值 例如将admin密码重设为admin 则修改第一行:"name":"admin","password":"21232f297a57a5a743894a0e4a801fc3" ![](https://cloud.githubusercontent.com/assets/3761968/2583304/764f562a-b9cf-11e3-8e59-afdbdffc20eb.png) ###ver2.61 `2014/7/12` ---- ####update: - 实时搜索,根据搜索框内容变化,实时选中匹配到的结果; - 弹出搜索框遍历子文件夹递归搜索 - session key 加入kod_前缀 避免和其他系统key冲突 - 编辑器选中优化 选择鼠标到窗口外事件处理 ####fix bug:(bug解决和程序优化) - backspace后退截获浏览器事件,作为后退前一访问的文件夹; - 搜索首字母不匹配问题 - 弹出层中的弹出层关闭,父窗口失去焦点问题。 - 代码中grunt部分代码拆分开,放到程序外面;提交到git、osc - 桌面:删除alert enter快捷键删除 - install 检测 加入跳过,(只判断用到的函数) 加入多语言 - zip压缩没有权限 提示红色,false 统一查找 - 登录成功后 验证码输错清除 - 非root用户拖拽到文件夹问题 - 非root解压问题 不能解压 - list oexe 图标问题 - 用户目录不存在判断 - fileCahe 互斥锁 reset 不用 - ie 8~10样式问题调整 ###ver2.6 `2014/7/6` ---- ####update: - 完全性优化;加入严格的校验机制 - 首运行环境检测[data目录检测,必须的函数支持提示] - 上传已存在处理——创建副本(另外包括粘贴,解压) - 选中优化 ctrl选中拖拽 - 键盘快捷键选中文件,多个字符

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值