线程的状态
 被创建 运行 冻结 消亡
 
 被创建--start()--> 运行
 运行----run()----> 消亡
         stop()
 运行---sleep(time)---> 冻结
        wait()-->
        <--notify()
 
 cpu 执行资格 被cup处理、处于队列中
 cpu 执行权   正在被cpu处理

创建线程的第二种方法
 实现Runnable接口
 
 Thread t1 = new Thread(d)//d是实现Runnable接口类创建的对象
 1、定义类实现Runnable接口
 2、覆盖接口中的run方法,将线程任务封装
 3、通过Thread类创建线程对象,将对象作为线程构造函数的参数进行传递
 4、调用线程对象的start方法

细节
 单独进行封装

线程安全问题
 1、多线程操作共享数据
 2、操作共享数据的线程代码有多条

同步代码块
 将多条操作共享数据的线程代码封装起来,只允许一个线程访问
 synchronized(对象){ 代码 }

同步代码块 利弊
 利 解决了线程的安全问题
 弊 效率降低

同步的前提 同步中必须有多个线程使用同一个锁

同步函数
 
同步函数的锁
 同步函数使用的锁是this

静态同步函数的锁
 函数所属字节码文件对象
 this.getClass();
 类.class

 class Ticket implements Runnable{ //extends Thread
private int num = 100;
Object obj = new Object();
boolean flag = true; public void run(){
//Object obj = new Object();
if(flag){
while(true){
show();
if(num==0)
return;
}
}else{
while(true){
synchronized(this){
if(num>0){
try{
Thread.sleep(10);
}catch(InterruptedException e){
}
System.out.println(Thread.currentThread().getName()+"...block..."+num--);
}
}
if(num==0)
return;
//}
}
} } public synchronized void show(){
if(num>0){
try{
Thread.sleep(10);
}catch(InterruptedException e){ }
System.out.println(Thread.currentThread().getName()+"...func..."+num--);
}
}
} public class SaleTicketsDemo{
public static void main(String[] args){
/*Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket(); t1.start();
t2.start();
t3.start();
t4.start();*/
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t); t1.start();
try{Thread.sleep(10);}catch(InterruptedException e){ }
t.flag = false;
t2.start(); }
}

单例模式 的多线程问题

 class Single{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if(s==null){
synchronized(Single.class){
if(s==null){
s = new Single();
}
}
}
return s;
}
}

死锁
 1、同步的嵌套

 class Test implements Runnable{
private boolean flag;
Test(boolean blag){
this.flag = flag;
}
public void run(){
if(flag){
while(true){
synchronized(MyLock.locka){
System.out.println(Thread.currentThread().getName()+" if locka...");
synchronized(MyLock.lockb){
System.out.println(Thread.currentThread().getName()+" if lockb...");
}
}
}
}else{
while(true){
synchronized(MyLock.lockb){
System.out.println(Thread.currentThread().getName()+" else lockb...");
synchronized(MyLock.locka){
System.out.println(Thread.currentThread().getName()+" else locka...");
}
}
}
}
}
}
class MyLock{
public static final Object locka = new Object();
public static final Object lockb = new Object();
}
class DeadLockTest{
public static void main(String[] args){
Test a = new Test(true);
Test b = new Test(false); Thread t1 = new Thread(a);
Thread t2 = new Thread(b);
t1.start();
t2.start();
}
}

Java Day 13的更多相关文章

  1. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

  2. linux下java.io.IOException: Cannot run program "/opt/jdk/jre/bin/java": error=13, Permission denied

    linux下启动jetty时报: [root@mv01 jetty-distribution-9.2.14.v20151106]# java -jar start.jar java.io.IOExce ...

  3. 033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结

    033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结 本文知识点:运算符和表达式知识点总结 前面学习的几篇文都是运算符和表达式相关的知 ...

  4. Java SE 13 新增特性

    Java SE 13 新增特性 作者:Grey 原文地址:Java SE 13 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  5. Java Hour 13 集合基础

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为13 Hour,请各位不吝赐教. Java 中的集 ...

  6. JAVA必备——13个核心规范

    标准的价值: 你听过这句话吗?"一流企业做标准.二流企业做品牌.三流企业做产品!"我时我就在想,做标准的企业就是一流的?卖产品就是三流公司?而坐产品或者加工的公司,即使说销售量非常 ...

  7. JAVA进阶13

    间歇性混吃等死,持续性踌躇满志系列-------------第13天 1.查看线程的运行状态 package code0327; class Demo01 implements Runnable { ...

  8. Java虚拟机13:Java类加载机制

    前言 我们知道我们写的程序经过编译后成为了.class文件,.class文件中描述了类的各种信息,最终都需要加载到虚拟机之后才能运行和使用.而虚拟机如何加载这些.class文件?.class文件的信息 ...

  9. centos8安装java jdk 13

    一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...

  10. Thinking in Java——笔记(13)

    Strings Immutable Strings Objects of the String class are immutable. Every method in the class that ...

随机推荐

  1. meta基础知识

    H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-width,initia ...

  2. Oracle笔记 一、oracle的安装、sqlplus的使用

    1. 首先你得安装Oracle数据库服务器端和客户端软件,在安装过程中要注意的是,选择oracle的安装目录,切记不要用中文目录或的带空格的目录. 下载地址: http://hi.baidu.com/ ...

  3. LINE最新版6.5.0在iOS上的删除信息取证

    iOS: 9.3.2版 LINE: 6.5.0版 取出LINE的数据库 Line.sqlite,路径如下所示: 检视删除的信息,发现还有不少残留,虽然都是片段,但拼拼凑凑总还是能有些蛛丝马迹,毕竟,总 ...

  4. 【风马一族_php】PHP与Mysql建立连接

    让php发出 Hi作为基础 http://www.cnblogs.com/sows/p/5990157.html 配置apache      ../apache/conf/httpd.conf 创建p ...

  5. [原]NYOJ 括号匹配系列2,5

    本文出自:http://blog.csdn.net/svitter 括号匹配一:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 括号匹配二:htt ...

  6. 刚开始学IOS遇到的类和方法

    框架:Core FoundationCFGetRetainCount. 类:NSRunLoop.NSAutoreleasePool.NSStringFormClass.UIApplicationMai ...

  7. PHP二维数组根据某个键名排序

    $result = array( array(           "amount": "11.00",           "date": ...

  8. C# 多线程操作样例

    using System; using System.Threading; //引用多线程 namespace ThreadTest { public class Alpha { public voi ...

  9. Mapreduce中的字符串编码

    Mapreduce中的字符串编码 $$$ Shuffle的执行过程,需要经过多次比较排序.如果对每一个数据的比较都需要先反序列化,对性能影响极大. RawComparator的作用就不言而喻,能够直接 ...

  10. python批量导出导入MySQL用户的方法

    这篇文章主要介绍了 数据库迁移(A -> B),需要把用户也迁移过去,而用户表(mysql.user)有上百个用户.有2种方法进行快速迁移: 1,在同版本的条件下,直接备份A服务器的mysql数 ...