java 线程Thread 技术--线程状态与同步问题
线程技术第三篇:
线程的状态:
1. 创建状态: 当用new 操作符创建一个新的线程对象时,该线程就处于创建状态,系统不为它分配资源
2.可运行状态:当线程调用start 方法将为线程分配必须的系统资源,安排其运行,并调用线程体中的run方法,这样线程就处于可运行状态
3.不可运行状态:当调用了sleep()方法,或者object 类中的wait() 方法,线程输入输出阻塞
4.消亡状态:run 方法执行完后,就会自动消亡
线程优先级:
1.线程创建时,子继承父的线程优先级
2.可以通过线程方法 setPriority()设置优先级
3.优先级在1-10整数之间
多线程的同步:
情景:在所线程环境里,可能有多个线程试图同时访问一个有限的资源,所以我们必须对这种潜在的资源冲突进行预防,
解决方法就是:在线程使用一个资源时候,对其加锁,访问资源的第一个线程为其加上锁之后,其他线程不可以进行对其的访问,除非锁被解除
synchronized 关键字:(都是重点)
1.当synchronized 关键字修饰一个方法的时候,那么该方法就是同步方法;
2. java 每个对象都有一把锁(监视器),当访问某个对象的synchronized 的方法时,表示将该对象上锁,那么其他的线程就无法访问synchronized 方法了,直到之前那个线程执行方法完毕后或者抛出异常,那么该对象的锁就会释放掉;其他线程才能访问synchronized 方法
3.如果一个对象有多个synchronized 方法,在某一时刻某一线程已经进入某个synchronized 方法,那么在该方法没有执行完毕之前,其他线程都无法访问
这个对象的任何synchronized 方法;
4.在遇到synchronized static 修饰的方法时候,它的锁不是synchronized 方法所在的对象,而是是当前对象所对应的的class 对象;因为static 是基于类的;
Example:
执行以下代码,我们可以明显看出,执行结果是有顺序的,因为synchronized 是在对象上加锁,只有执行完一个synchronized 方法,才能执行下一个synchronized
/**
* this demo diaplay keywords synchronized is add lock in Object
* when Object has many synchronized method , and some Thread invoke some synchronized method,
* then other Thread refuse to call on any synchronized method ,only if some synchronized method
* invoke finish.
*
* @author iscys
*
*/
public class SynchronizedObjectLock { public static void main(String[] args) {
//设置唯一对象
Example example =new Example();
ImplRunnable run1=new ImplRunnable(example);
ImplRunnable2 run2=new ImplRunnable2(example);
Thread th1 =new Thread(run1);
Thread th2 =new Thread(run2);
th1.start();
th2.start();
} } class Example{ public synchronized void ex() {
for(int i=0;i<20;i++) {
System.out.println("ex method"+i);
}
} public synchronized void ex2() {
for(int i=0;i<20;i++) {
System.out.println("ex2 method"+i);
}
}
} //one instance of thread
class ImplRunnable implements Runnable{ private Example example;
//construct
public ImplRunnable(Example example){
this.example =example;
}
@Override
public void run() {
example.ex(); } }
//one instance of thread
class ImplRunnable2 implements Runnable{ private Example example;
//construct
public ImplRunnable2(Example example){
this.example =example;
}
@Override
public void run() {
example.ex2(); } }
在这个例子的基础上,我们将一个方法改为静态方法去运行:其实执行的结果是乱序的,因为被static 修饰的方法,属于类本身,它的锁对应的是class 对象
而未被static 修饰的,锁则是synchrionized 所在的对象;
  public synchronized static void ex2() {
        for(int i=0;i<20;i++) {
            System.out.println("ex2 method"+i);
        }
5.同步的第二种方式,使用同步代码块 ,线程执行会对Object 对象上锁,其他规则与synchronized 一致
private Object object =new Object();
synchronized(object){
//body.....
}
java 线程Thread 技术--线程状态与同步问题的更多相关文章
- java  线程Thread 技术--线程创建源码解释
		
永远不要忘记最基础的东西,只有把最基础的知识打牢靠,才能够使你走的更远,我将从今天开始,进行线程知识的回顾,一些常用知识点,以及java1.5 引入的并发库,进行详细的讲解与总结 创建线程的目的是为了 ...
 - java  线程Thread 技术--线程方法详解
		
Thread 类常用的方法与Object类提供的线程操作方法:(一个对象只有一把锁
 - java  线程Thread 技术--volatile关键字
		
java 语言中允许线程访问共享变量,为了保证共享变量能被准确和一致的更新,Java 语言提供了volatile 关键字,也就是我们所说的内存一致性: 问题抛出:(尝试去运行下面代码,以及将volat ...
 - java  线程Thread 技术--1.5 Executor Executors,ThreadPool,Queue
		
Executors : Executors ,就是一个线程工具类:大部分操作线程的方法,都可以在这个工具类中就行创建,执行,调用一些线程的方法: Executor : 用于执行和提交一个runnabl ...
 - Java daemon thread 守护线程
		
守护线程与普通线程写法上基本么啥区别,在启动线程前, 调用线程对象的方法setDaemon(true),则可以将其设置为守护线程. 守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收.内存 ...
 - java 多线程: Thread  并发访问-代码块同步synchronized {};String作为被锁的对象
		
方法同步的弊端 方法同步的时候,如果一个方法需要线程安全控制的代码速度其实很快,但是还有其他的业务逻辑代码耗时非常长(比如网络请求),这样所有的线程就在这一块就等待着了,这样造成了极大的资源浪费如果并 ...
 - 线程Thread、线程池ThreadPool
		
Thread调用含参方法,参数必须是object类.ThreadPool调用的方法,无论是否含参,方法必须有object类参数(可不用,但得有) [线程] using System; using Sy ...
 - 笔记-13-多线程 Thread方法 线程安全 生产者和消费者 死锁和阻塞 练习
		
题目1 编写程序,创建两个线程对象,一根线程循环输出"播放背景音乐",另一根线程循环输出"显示画面";要求: 1: 1个线程使用Runnable接口的匿名内部类 ...
 - java  线程Thread 技术--1.5 Future与Callable
		
Callable: 从官方文档说起: 通过实现callable 的called 方法可以使一个任务可以返回一个结果以及可能抛出一个异常: callable 与runnable 是相似的,可以被其他线程 ...
 
随机推荐
- javascript:图片转base64
			
第一种: <!DOCTYPE html><html> <head> <meta charset="utf-8"> <meta ...
 - keal
			
I remember the wonderful moment you appeared before me, like a fleeting vision, like a genius of pur ...
 - 2339 3.1.1 Agri-Net 最短网络
			
Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享 ...
 - Haskell语言学习笔记(76)Data.Tree
			
Data.Tree data Tree a = Node { rootLabel :: a, subForest :: Forest a } deriving (Eq, Read, Show) typ ...
 - 转: CSS3 @media 用法总结
			
一.首先是<meta>标签 <meta name="viewport" content="width=device-width, initial-sca ...
 - 1.Tomcat配置.md
			
1.启动 解压缩安装包后,点击startup.bat,保持控制台窗口开启 浏览器中输入http://localhost:8080 后看到启动界面则表示启动成功 点击shutdown.bat则关闭Tom ...
 - ESET官方下载地址
			
官方远程下载 ESET NOD32 Antivirus(32位) ESET NOD32 Antivirus(64位) ESET Smart Security(32位) ESET Smart Secur ...
 - struts2与spring整合时需要注意的点
			
首先我们需要明白spring整合struts2中的什么东西,spring中的核心就是IOC和AOP,IOC是对象的容器,AOP是处理动态代理的;比如spring与hibernate整合时就要用到aop ...
 - Python列表推导式
 - 项目IDEA启动配置
			
在所有java启动项中加入 -Djute.maxbuffer=2048000 tomcat 在catalina.bat 中第一行加入 set JAVA_OPTS=-Djute.maxbuffer=20 ...