一,线程之间的关系

  线程之间存在两种关系:

  (1)间接相互制约:相互争夺线程资源;

  (2)直接相互制约:线程之间的相互合作;

  间接相互制约也可以成为互斥,直接相互制约也可以称为同步;同步也包括互斥,互斥是一种特殊的同步。

二,线程同步的思想:

  线程同步的主要任务是使并发对线程之间能够有效的共享资源和合作。

(1)互斥

  多个线程互斥的资源应该放在同一个类中,用锁锁住该类,再用类来创建对象,在不同的线程中调用该类的资源,在一个线程访问时,另一个线程就不能访问该资源(被锁锁住的资源只能被一个线程访问),当一条线程访问完了,多条线程再次争夺资源。

(2)同步

  线程之间的相互合作称为同步,多个线程之间相互协调,在互斥的基础上加一个布尔值,当线程调用同步资源的时候会先判断布尔值是否正确(既是否到自己执行了),是的会就继续执行,不是的话就使用Thread.wait(),等待另一个线程来执行同步资源,另一个线程执行完同步资源后,修改布尔值,再调用notify或者notifyAll方法唤醒等待锁的线程:

  经验:要用到的共同数据(包括同步锁)的若干个方法因该用在同一个类身上,这种设计也刚好体现了高内聚和程序的健壮性。

  注意:两个线程要执行的代码片段要实现互斥,则它们必须使用同一个锁对象,既锁要上在同步资源类的方法上,而不是线程的代码里,注意,判断布尔值是一定要在synchronized方法里或者synchronized代码块里,如果是使用代码块,使用wait,notifyAll,notify是一定是要使用锁住的那个对象来调用方法,如果是synchronized方法,那么它指向的是类创建的那个对象。

  判断布尔值时可以使用if或者是while,但是建议使用while,因为有时候线程被伪唤醒,既没有被通知就自己醒来,这时候使用while可以继续判断布尔值是否正确,但是使用if的话在线程陷入沉睡前已经判断了一次,不会再判断了,而是继续向下执行,造成错误。

java线程——线程基础的更多相关文章

  1. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  2. Java多线程系列--“基础篇”06之 线程让步

    概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...

  3. Java多线程系列--“基础篇”07之 线程休眠

    概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...

  4. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...

  5. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...

  6. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  7. Java并发(基础知识)—— Executor框架及线程池

    在Java并发(基础知识)—— 创建.运行以及停止一个线程中讲解了两种创建线程的方式:直接继承Thread类以及实现Runnable接口并赋给Thread,这两种创建线程的方式在线程比较少的时候是没有 ...

  8. Java线程核心基础(上)

    Java线程核心基础(上) 一.实现多线程 根据Oracle官方文档,目前推荐的创建线程方法主要有两种,分别是继承Thread类和实现Runnable接口.通过阅读Thread类源码,可以发现二者不同 ...

  9. Java并发编程基础--基本线程方法详解

    什么是线程 线程是操作系统调度的最小单位,一个进程中可以有多个线程,这些线程可以各自的计数器,栈,局部变量,并且能够访问共享的内存变量.多线程的优势是可以提高响应时间和吞吐量. 使用多线程 一个进程正 ...

  10. java线程基础知识----java daemon线程

    java线程是一个运用很广泛的重点知识,我们很有必要了解java的daemon线程. 1.首先我们必须清楚的认识到java的线程分为两类: 用户线程和daemon线程 A. 用户线程: 用户线程可以简 ...

随机推荐

  1. Vulkan SDK 之 Graphics Pipeline

    A graphics pipeline consists of shader stages, a pipeline layout, a render pass, and fixed-function ...

  2. 对plotTree的解释

    1.>>>a = 1/2/2   >>>a >>>0.25 2.def plotMidText(cntrPt,parentPt,txtString ...

  3. 075-PHP数组添加元素

    <?php $arr = array(); //定义一个数组,它没有任何元素 echo '增加元素之前数组中元素的个数为:' . count($arr); //输出数组个数 for ($i = ...

  4. Impala 笔记

    简介 Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能. 基于Hive使用内存计算,兼顾数据仓库.具有实时.批处理.多并发等优点 是CDH平台首选的PB级 ...

  5. opencv.js双边滤波 磨皮处理

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http ...

  6. 全局唯一性ID生成方法小结

    全局ID通常要满足分片的一些要求:1 不能有单点故障.2 以时间为序,或者ID里包含时间.这样一是可以少一个索引,二是冷热数据容易分离.3 可以控制ShardingId.比如某一个用户的文章要放在同一 ...

  7. ucosiii 学习笔记

    OSTaskCreate 的参数中有一个 void *p_ext,这个参数用来传递额外的信息,可以用来传递数组,结构体等等. AppTaskStart --> CPU_Init --> C ...

  8. Android进阶——Crash异常捕获并发送到服务器

    在项目中,我们常常会遇到Crash的现象,也就是程序崩溃的时候,这个时候最常看到的就是这个界面 如果你的项目已经发布到市场上了,这样的崩溃对于开发人员是看不到的,所以我们得想方法将崩溃信息发送到服务器 ...

  9. RectTransform详解

    乾坤那个大挪移   ----------------------------------------------------------------- 我是分割线 ------------------ ...

  10. 低JAVA版本,高兼容性启动

    低JAVA版本,高兼容性启动 背景:部分操作系统java环境低版本,暂时无法更新最新版本,新系统需要使用较高版本Java环境 1.JAVA低版本不兼容当前应用 2.解压安装JAVA,无需配置环境变量 ...