多线程

作者: 小贱贱9395 | 来源:发表于2018-05-03 21:25 被阅读4次

    原文:http://blog.csdn.net/luoweifu/article/details/46613015
    作者:luoweifu
    转载请标名出处

    传统创建多线程方式

    1. 重写Thread父类的run方法


      方式1

    2.创建Runnable对象,将Runnable对象传递到Thread的构造方法中


    方式2.png

    Timer

    TimerTask:任务
    delay:延迟多少毫秒执行
    period:间隔周期


    Timer定时器

    线程互斥与同步


    obj可以用this,也可以使用多个线程共同访问的对象
    1.synchronized修饰代码块
    当两个并发线程(thread1和thread2)访问同一个对象(syncThread)中的synchronized代码块时,在同一时刻只能有一个线程得到执行,另一个线程受阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块。thread1和thread2是互斥的,因为在执行synchronized代码块时会锁定当前的对象,只有执行完该代码块才能释放该对象锁,下一个线程才能执行并锁定该对象。
    一个线程访问一个对象的synchronized代码块时,别的线程可以访问该对象的非synchronized代码块而不受阻塞

    当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的对象来充当锁:

    2.synchronized修饰方法
    Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,public synchronized void method(){//todo}; synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起来的范围,而修饰方法范围是整个函数。

    在用synchronized修饰方法时要注意以下几点:

    1. synchronized关键字不能继承。
    2. 在定义接口方法时不能使用synchronized关键字。
    3. 构造方法不能使用synchronized关键字,但可以使用synchronized代码块来进行同步。
    1. synchronized修饰静态方法\类


    synchronized作用于一个类T时,是给这个类T加锁,T的所有对象用的是同一把锁。

    总结:

    A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
    B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。
    C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

    相关文章

      网友评论

          本文标题:多线程

          本文链接:https://www.haomeiwen.com/subject/gnblrftx.html