一,线程之间的关系

  线程之间存在两种关系:

  (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. 021-PHP常用的数值类型判断函数

    <?php //判断数组 $colors = array("red", "blue", "green"); if(is_array($ ...

  2. 125-PHP类__set()魔术方法

    <?php class ren{ //定义一个人类 //定义成员属性 private $name='tom'; private $age=15; //定义__set()魔术方法 public f ...

  3. Java算法练习—— Z 字形变换

    题目链接 题目描述 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  4. 洛谷 P1504 积木城堡

    题目传送门 解题思路: 01背包. AC代码: #include<iostream> #include<cstdio> #include<vector> using ...

  5. PHP二维数组--去除指定列含有重复项的数组

    给定二维数组: $arr = array( '0' => array('张三',2,3,4), '1' => array('李四',2,3,4), '2' => array('张三' ...

  6. java课程课后作业190502之单词统计

    自己想的方法一直都不是很好,但是又一直忘了改自己的算法,只能硬着头皮接着用自己以前的老方法了 第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后 ...

  7. JS高级学习笔记(10) 之 js 时怎么解析HTML标签的

    DOM 节点类型 浏览器渲染过程 浏览器是怎么把HTML标签语言和JavaScript联系在一起的,这就是我们常说的DOM. 浏览器中的DOM解析器把HTML翻译成对象(object),然后JavaS ...

  8. 利用libpcap抓取数据包

    转载自:http://blog.csdn.net/tennysonsky/article/details/44811899 概述 libpcap是一个网络数据包捕获函数库,tcpdump就是以libp ...

  9. JavaWeb之搭建自己的MVC框架(三)

    1. 前言         在前两节的内容中,我们完成了一个基本的框架搭建.但是如果我们在前端请求中增加参数,我们要怎么传递到后台方法呢?接下来我们就来研讨这部分内容. 2. 实现         ( ...

  10. Redis的学习之路

    应用场景 1.作为缓存使用  (1)原始业务功能设计 秒杀 双十一.618 排队购票 (2)运营平台察觉到突发式高频访问热点 突发式热点新闻 (3)高频复杂的统计数据 在线直播 投票排行榜 2.附加功 ...