一,线程之间的关系

  线程之间存在两种关系:

  (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. 036-PHP闭包函数的域限制,与如何向闭包函数传递变量

    <?php // 闭包函数的域限制,与如何向闭包函数传递变量 # 隐藏上面的代码,我们最后再来试下 function demo($ATxt) { $func = function () use ...

  2. String巩固

    About String in Java 如今做了一个重大决定,不定期温习The Basement Of Java String对象的认知简述 首先 String不属于 8种基本数据类型, Strin ...

  3. mysql 统计值为NULL不为0的问题

    今天在写一个接口的时候是要统计数据,但是突然发现报错,类型不匹配的问题,我返回的是Int类型的为啥会类型不匹配呢,真的是奇怪 然后把代码丢到正式环境里面运行一下,发现值为null 一下子就傻眼了,不可 ...

  4. Spring Tools 4 STS没有创建Dynamic Web Project的选项 以及 Spring Tools 4 STS New 菜单没有Spring Bean Configuration File选项

    Spring Tools 4 STS没有创建Dynamic Web Project的选项 STS4默认不带Dynamic Web Project插件. 解决方法:1.打开:Help 选择 Instal ...

  5. mybatis初步配置容易出现的问题

    The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You ...

  6. Android Studio Madual作为application的使用以及工作空间和modual的区别

    Android Studio Madual作为application的使用以及工作空间和modual的区别 前言: 写这篇文章的目的是因为自己使用Android Studio开发时进入了一个误区,后面 ...

  7. html 鼠标样式 鼠标悬停 小手样式

    在style中添加cursor:pointer 实现鼠标悬停变成小手样式 先来一个示例 <div style="float:right"> <a class=&q ...

  8. Python爬虫的简单入门(一)

    Python爬虫的简单入门(一) 简介 这一系列教学是基于Python的爬虫教学在此之前请确保你的电脑已经成功安装了Python(本教程使用的是Python3).爬虫想要学的精通是有点难度的,尤其是遇 ...

  9. 每天一点点之laravel框架开发 - passport授权报invalid_credentials

    {"error":"invalid_credentials","message":"The user credentials we ...

  10. 查询内核符号链接的信息的API

    NtOpenSymbolicLinkObject和NtQuerySymbolicLinkObject获取指定符号链接的信息 版权声明:本文为博主原创文章,未经博主允许不得转载.