1. Home
  2. 代码
  3. Java

Java多线程(二)

Java多线程

1. run()和start()方法

     run方法就是一个类的普通的方法,与其他类的实例的方法没有任何区别;start方法是启动线程。

2. sleep()和yield()方法

    sleep:线程睡眠,但是不会释放锁;
    yield:让出当前线程占有的cpu,当前线程变为可运行状态,下一刻仍然可能会被cpu调度,不会释放锁

3. wait()、notify()和notifyAll()

    这几个方法是Obejct类的方法。调用以前对象必须持有锁,调用后会释放锁。
    wait:使线程进入等待状态,需要使用notify或者notifyAll方法来唤醒
    notify:唤醒一个等待状态的线程,但是具体唤醒哪个线程是要看cpu的心情。
    notifyAll:唤醒所有处于等待状态的线程

4. 线程间的协作和通信

    每个线程有自己栈空间,孤立运行,对我们没有价值。如果多个线程能够相互配合完成工作,这将会带来巨大的价值。

4.1 volatile和synchronized

    volatile:多个线程同时访问一个共享的变量的时候,每个线程的工作内存有这个变量的一个拷贝,变量本身还是保存在共享内存中。Violate修饰字段,对这个变量的访问必须要从共享内存刷新一次。最新的修改写回共享内存。可以保证字段的可见性。绝对不是线程安全的,没有操作的原子性。适用场景:1、一个线程写,多个线程读;2、volatile变量的变化很固定。
    不是线程安全的,能保证线程的可见性,不能保证操作的原子性,读取volatile变量的时候,从共享内存去读;修改volatile变量的时,会将改变的值写回共享内存
    synchronized:可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性,又称为内置锁机制。
    Synchronized的类锁和对象锁,本质上是两把锁,类锁实际锁的是每一个类的class对象。对象锁锁的是当前对象实例。

4.2 等待和通知机制

    等待方原则:
1、获取对象锁
2、如果条件不满足,调用对象的wait方法,被通知后依然要检查条件是否满足
3、条件满足以后,才能执行相关的业务逻辑
Synchronized(对象){
      While(条件不满足){
          对象.wait()
      }
      业务逻辑处理
}
      通知方原则:
1、 获得对象的锁;
2、 改变条件;
3、 通知所有等待在对象的线程
Synchronized(对象){
      业务逻辑处理,改变条件
      对象.notify/notifyAll
}

5. join

    线程A,执行了thread.join(),线程A等待thread线程终止了以后,A在join后面的语句才会继续执行

6. ThreadLocal

    本质是个map,map的键就是每个线程对象,值就是每个线程所拥有的值,常用方法:
    1. initialValue()
    2. get()
    3. set()
    4. remove():将当前线程局部变量的值删除,这个方法是JDK 5.0新增的方法。当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
    ThreadLocal拥有的这个变量,在线程之间很独立的,相互之间没有联系。内存占用相对来说比较大。

7. 等待超时模型

    调用场景:调用一个方法时等待一段时间(一般来说是给定一个时间段),如果该方法能够在给定的时间段之内得到结果,那么将结果立刻返回,反之,超时返回默认结果。
    假设等待时间段是T,那么可以推断出在当前时间now+T之后就会超时
    等待持续时间:REMAINING=T。
    超时时间:FUTURE=now+T。

// 对当前对象加锁
public synchronized Object get(long mills) throws InterruptedException {
       long future = System.currentTimeMillis() + mills;
       long remaining = mills;
       // 当超时大于0并且result返回值不满足要求
       while ((result == null) && remaining > 0) {
            wait(remaining);
           remaining = future – System.currentTimeMillis();
       }
     return result;
}

Java多线程(一)

作者:catchdream,如若转载,请注明出处:https://www.6r6.cc/code/953.html
文章内容包括PDF与软件、文章图片等内容来自于互联网、若您下载了本站分享的软件、PDF等内容下载后请于24小时内删除、与本站无任何关联、本站所有内容基于个人学习,勿做任何非法使用、本站也不传播非法内容、谢谢合作!若有侵权请联系我们下架处理-GD-sec诡道网络诡道安全

Leave a Reply

Your email address will not be published. Required fields are marked *

8 − five =