zoukankan      html  css  js  c++  java
  • 多线程

    1.启动一个线程有两种方式,new Thread()和实现runable接口

    2.synchronized关键字给对象加锁,该对象可以为自己this,在方法上加synchronized锁定的是自己这个对象,在静态方法上锁住的是当前的这个class

    3.对业务写方法加锁,而对业务读方法不加锁,容易出现数据脏读的问题。

    4.一个同步方法可以调用另外一个同步方法,一个线程已经拥有某个对象的锁,再次申请的时候仍然会得到该对象的锁,也就是说synchronized获得的锁是可重入的。

    5.模拟死锁,线程1需要锁定a,在锁定a的过程需要锁定b,线程2需要锁定b,在锁定b的过程需要锁定a,会出现死锁。

    6.程序在执行过程中,如果出现异常,默认情况锁会被释放,所以,在并发处理的过程中,有异常要多加小心,不然可能会发生不一致的情况。例如在web程序中,多个线程同时访问某个资源,如果某个线程出现异常,那么其他线程就会进入同步代码块,读取前一个线程未处理完的数据。

    7.volatile关键字,使得一个变量在多个线程间可见,A B线程都用到一个变量,java默认是A线程中保留一份copy,这样B线程修改了该变量,A并不知道。但加了volatile会强制所有线程到堆内存读取最新的值。

    8.volatile只是保证了可见性,不保证原子性。synchronized既保证可见性也保证原子性。volatile不能完全替代synchronized。

    9.Atomxxx类具有原子性。

    10.不要以字符串常量作为锁定对象,因为程序使用的类库可能和你的程序使用了同一把锁。

    11.thread.yeild() 暂停当前正在执行的线程对象,并执行其他线程。让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

    12.thread.Join()把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

    13.Object的三个方法,void notify() 唤醒在此对象监视器上等待的单个线程,void notifyAll() 唤醒在此对象监视器上等待的所有线程,void wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

    14.守护线程,调用线程对象的方法setDaemon(true),即可以将其设置为守护线程,守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收、内存管理等线程都是守护线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。

    15.lock和synchronized区别,lock可用于替换synchronized,lock更灵活,可手动释放锁,还提供了一些灵活的方法,例如lock可实现公平锁,而synchronized是非公平锁。

  • 相关阅读:
    使用VisualStudio2015开发QT项目
    界面控件
    SmartGit 试用过期
    视图和模型变换
    模型变换和视图变换
    一元二次方程
    论cudnn与cuda之间的关系,和实际例子测试。
    在Ubuntu 18.04上安装Tensorflow
    ubuntu14.04安装CUDA8.0
    Windows10系统远程桌面连接出现卡顿如何解决
  • 原文地址:https://www.cnblogs.com/notejava/p/7384535.html
Copyright © 2011-2022 走看看