Java线程同步

一、定义

当两个或多个线程需要访问同一资源时,需要以某种顺序来确保该资源某一时刻只能被一个线程使用

二、实现线程同步的方法

同步方法( synchronized )
同步代码块( synchronized)

三、同步代码块

同步代码块:synchronized放在对象前面限制一段代码的执行

语法格式:

synchronized(对象)//这个对象可以为任意对象 ,该对象就是锁
{ 
    需要被同步的代码 
} 

同步条件

    必须要有两个或者两个以上的线程 

缺点:

多个线程需要判断锁,较为消耗资源

四、锁

互斥锁

    同一时刻只能有一个线程占用,其他线程要等这个线程执行完释放锁以后才能使用锁

任意锁

    可以是任意类型对象

多个线程必须使用同一个锁 , 才能起到互斥的作用

同步中的锁

    同步代码块:this或其他共同对象
    非静态方法:this
    静态方法:类.class

注意:

任意锁和互斥锁是同一个锁,只是从不同角度出发,定义为不同的锁。任意锁:指对象类型可以任意;互斥锁指锁一次只能让一个线程用

五、同步方法

同步非静态方法

    synchronized放在方法声明中,表示整个方法为同步方法,锁定this对象,如果有一个线程进入了该方法,其他线程要想使用当前this对象的任何同步方法,都必须等待前一个线程执行完该同步方法之后

同步静态方法

     synchronized放在static方法声明中,表示锁定该类的class对象(Xxx.class,是Class类型的,是描述一个类的信息的对象)
    如果有一个线程进入了该方法,其他线程要想使用当前类中的任何同步静态方法,都必须等待前一个线程执行完该同步方法之后;其他非同步方法及非静态的同步方法的执行不受影响

六、锁的选择

多个线程共享资源,为了保证数据安全,需要同步
一般情况下选择资源作为锁(必须为引用类型)即可,也可以选择其他唯一的对象

七、死锁

线程双方都持有者自己的锁不放,还想要对象的锁,僵持着,于是产生死锁

死锁发生的条件

    同步中嵌套同步
    锁不同

八、守护线程

1)在Java中有两类线程
    User Thread(用户线程或前台线程)  
    Daemon Thread(守护线程或后台线程)

2)其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开:如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了

3)设置守护线程的方法要写在 start前面

4)子线程设置成为守护线程, 当主线程 执行完了,子线程就结束执行

5)线程对象.setDaemon(true)   默认为false
posted @ 2017-05-02 15:23  TCB_Java  阅读(273)  评论(0编辑  收藏  举报