zoukankan      html  css  js  c++  java
  • Java

    要注意ClassInstance == XXX 的情况,如果ClassInstance是基本数据类型的封装类且为null,会产生空指针错误。

    Boolean对象就出现了这个问题,可能是基本数据类型的封装类会调用valueOf()

    Wait/notify

    wait()方法表示,放弃当前对资源的占有权,等啊等啊,一直等到有人通知我,我才会运行后面的代码。
    notify()方法表示,当前的线程已经放弃对资源的占有,通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复, 然后继续运行wait()后面的语句;notifyAll()方法表示,当前的线程已经放弃对资源的占有, 通知所有的等待线程从wait()方法后的语句开始运行。

    Sychronized

    在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。java的wait吊起线程的时候会释放synchronized锁。所以可以同时在wait和notifyAll的两个不同代码块中使用synchronized。

    1,修饰函数

    public synchronized void accessVal(int newVal);
    synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。

    2,修饰代码段

    synchronized(syncObject) {

    //允许访问控制的代码
    }

    其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行。

    当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的除synchronized(this)同步代码块以外的部分。

    一般来说,需要保护的都是static的数据,因为它们可以被不同的线程所访问。还有就是几个线程共有一个实例的情况,需要sychronized保护。

    Thread

    可以传入Runnable来实例化Thread,在runnable中也可通过Thread.currentThread()获取所属的Thread实例。

    Thread.interrupt()

    要中断Thread,只能使用Thread.interrupt()方法使线程受到阻塞时抛出一个中断信号。

    真正要实现中断,还需要对这个中断信号进行处理:

    1,捕获异常。因为block的线程(sleep() or join())在被调用interrupt时会产生InterruptException,可以捕获该异常来决定是否中断。如果不处于block状态,不会抛出异常,直到block。

    2,使用Thread.interrupted()判断是否收到中断信号。

    Thread.yield()

    暂停当前正在执行的线程对象,并执行其他线程。

    注意:这里的其他也包含当前线程。

    Thread.sleep(long millis)

    使当前线程暂停millis所指定的毫秒,转到执行其它线程。

    Thread.join()

    先start()执行线程,然后join(),使join()后面的代码要等线程执行完再运行

  • 相关阅读:
    关于架构,关于系统,关于合作,我也得问问我们自己
    vs2013 无法打开 源 文件 "SDKDDKVer.h"
    视频基础知识汇总
    python gRPC接口调用
    python多线程同时执行2个函数任务之threading
    git基本操作_快速查询
    pycharm激活码 我是搬运工
    CodeReview的一些原则
    python多线程执行同一个函数任务之threading、ThreadPoolExecutor.map
    python程序超时处理 timeout_decorator
  • 原文地址:https://www.cnblogs.com/wolflzc/p/6178812.html
Copyright © 2011-2022 走看看