JAVA初学笔记16

线程安全问题

原因

        多个线程同时操作同一个数据就会出现线程安全问题

解决思想

        多个线程同时只能有一个线程对数据进行操作

解决方案

        方案1:同步代码块       

语法:
    synchronized(锁对象){
        要同步的代码
    }

上锁与开锁:
    当某一个线程进入synchronized代码块中,其锁对象就会上锁,此时别的线程就无法进入,只能在外等待开锁
    当一个线程执行完成synchronized代码块中的代码,此时锁对象就会开锁

注意:
    所有的对象都可以作为锁对象
    要保证多个线程的锁对象是同一对象

        方案2:同步方法

语法:
    访问权限修饰符 synchronized 返回值类型 方法名(形参列表){
        方法体(要同步的代码)
    }

注意:
    同步方法的锁对象时调用该方法的对象(同步方法的锁对象就是this)

        方案3:同步静态方法

语法:
    访问权限修饰符 synchronized static 返回值类型 方法名(形参列表){
        方法体(要同步的代码)
    }

注意:
    同步静态方法的锁对象是该方法所属的类的类对象
类对象:一个类被JVM加载时会产生一个类对象,该对象包含该类的所有信息,如该类的包名,类名,父类名,实现的接口名,属性数量,方法数量,方法名等信息
    因为一个类只会被加载一次,所以一个类只有一个类对象

死锁(了解)

        多个线程互相持有对方所需的资源

线程间通讯

        方法:

                唤醒

objet.notify();

        作用:随机唤醒一个使用调用该方法的对象作为锁对象的线程

objet.notifyAll();

        作用:随机唤醒所有使用调用该方法的对象作为锁对象的线程

                休眠

 objet.wait();       

        作用:让当前线程陷入无限期休眠

objet.wait(timeout);       

        作用:让当前线程有限期休眠,参数为休眠时间,单位毫秒

objet.wait(timeout, nanos);       

         作用:让当前线程有限期休眠,休眠时间毫秒+纳秒

wait与sleep的区别:
        wait:
            由object类提供的普通方法
            只能在同步中使用
            休眠期间会释放持有的锁对象
        sleep:
            由Thread类提供的静态方法
            可以在同步中,也可以在同步外使用
            休眠期间不会释放持有的锁对象

        注意:

                1,该方法由object类提供

                2,只能在同步代码块或同步方法中使用

                3,必须使用该同步代码块或同步方法的锁对象调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值