1、简介。进程和线程:简单的说就是进程负责为程序开辟内存空间,线程负责具体的执行单元(执行路径)。

一个进程中可以有多个执行路径,称为多线程。CPU一次只能执行一个进程,但是一个进程内部可以有多个线程在执行。

最早的多进程,多线程效果其实是CPU进行快速切换的效果,由于切换速率很快用户不能发现。现在可以使用多CPU来实现。

参考:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

2、线程状态图

3、线程的创建:进程和线程是由系统开启的,Java通过和底层进行交互,暴露出Runnable接口和Thread类来供用户创建线程。

线程创建的第一种方式和注意事项

第一种创建方式是继承Thread类,有两个问题:

  1、如果这个类有自己的父类则会引起冲突(当然可以将其父类继承Thread类,但是不建议这样做)

  2、如果只是想将该类中的方法作为线程的执行任务而不想作为一个线程对象(因为会包含许多线程相关的无用方法)

此时可以使用第二种方式:实现Runnable接口,具体过程见下:

!!!多线程还有问题就是

  1、使用执行代码中的数据问题,就是这些数据是否是同一份(例如买票问题,开多个窗口即线程,但是卖的是同一批票)

  2、在多个线程使用同一共享数据的安全问题

 class SynLockDemo
{
public static void main(String[] args){
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 Ticket implements Runnable
{
private int num=100;
boolean flag=true;
//Object obj=new Object();
public void run(){
/*
关于同步应该注意到
1、同步是由synchronized修饰的,但是锁不是同步的特性,因为要在其后加一个对象作为锁使用
2、同步函数并没有声明一个锁却有同步效果,而函数天然具有一个对象this(除了static函数)
下面的操作是将同一段操作分别用同步代码块和同步函数封装,用一个标志选择进入两个不同的块中
如果两个线程使用的是同一个锁,则不会出现安全隐患(在这里就是0,-1,-2号票)
实践证明:使用this对象时正常,使用其他对象时有安全问题 由于static函数随着类加载而加载,所以没有this,但是当类加载进内存时会生成一个类文件对象,
!!!用this.getClass()/类名.class获取,两者的区别是:前者是非静态的方法,后者是用类静态获取 注意:同步函数可以看作是同步代码块在使用this时的特例
*/
if(flag){
while(true){
//synchronized(obj){
synchronized(this){
if(num>0){
try{Thread.sleep(10);}catch (InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"...obj..."+num--);
}
}
}
}else{
while(true){
show();
}
}
}
public synchronized void show(){
if(num>0){
System.out.println(Thread.currentThread().getName()+"...this..."+num--);
}
}
}

synchronized同步锁

 class DeadLockDemo
{
public static void main(String[] args){
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 Ticket implements Runnable
{
private int num=100;
boolean flag=true;
Object obj=new Object();
public void run(){
/*
死锁发生在一段线程执行代码中有多个锁,且锁是嵌套存在的,这时多个线程持有了不同锁而且互不相让,这时就引发死锁问题
死锁的表现就是代码运行非正常终止。
*/
if(flag){
while(true){
synchronized(obj){
show();
}
}
}else{
while(true){
show();
}
}
}
public synchronized void show(){
synchronized(obj){
if(num>0){
System.out.println(Thread.currentThread().getName()+"...this..."+num--);
}
}
}
}

死锁

Java学习笔记四的更多相关文章

  1. Java学习笔记四---打包成双击可运行的jar文件

    写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...

  2. Java学习笔记四:Java的八种基本数据类型

    Java的八种基本数据类型 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. Java基本类型共有八种,基本类型可以分为三类,字符类型char,布 ...

  3. Java学习笔记四——运算符

    算术运算符 加减乘除(+.-.*./)就不说了. 求余运算符% 描述:第一个操作数除以第二个操作数,得到一个整除的结果后剩下的值就是余数 注意:求余预算的结果不一定总是整数,当操作数是浮点数时,结果可 ...

  4. Java 学习笔记 (四) Java 语句优化

    这个问题是从headfirst java看到的. 需求: 一个移动电话用的java通讯簿管理系统,要求最有效率的内存使用方法. 下面两段程序的优缺点,哪个占用内存更少. 第一段: Contact[]c ...

  5. Java学习笔记四:三目运算符与字符串连接符等

    一 .三目运算符与自增自减 GitHub代码练习地址:https://github.com/Neo-ML/JavaPractice/blob/master/OperPrac02.java 条件运算符由 ...

  6. 面向对象三大特征之封装与static——(Java学习笔记四)

    面向对象     编程本质:以类的方式组织代码,以对象的方式组织(封装)数据 对象:具体的事物,某个类的对象(实例) 类:是对对象的抽象,用于描述同一类型的对象的一个抽象概念 对象和类的关系:特殊到一 ...

  7. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  8. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  9. Java IO学习笔记四:Socket基础

    作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...

随机推荐

  1. Ubuntu14.04下安装和"激活"Office2010ProPlus与Visio2010(15.11.20Updated)

    本人用Ubuntu的时候全然没有打游戏的欲望,故而能够更高效的工作. 尽管说LibreOffice.WPS等等有Ubuntu版本号,可是用着还是没有微软的Office顺手,故而折腾了一下怎样安装Off ...

  2. github关联域名,创建个人站点教程终结篇

    1.背景 近期心血来潮,买了一个域名,本来要买fuckgfw的,没想到被抢注了.就拿自己的英文名买了一个.叫做www.garvinli.com.由于知道会有非常多朋友不太清楚整个站点搭建的过程,所以在 ...

  3. 关于WMware Workstation出现 “”该虚拟机似乎正在使用中“”解决办法

    如图 直接到配置文件D:\centos1\这个目录下 将vmdk.lck文化删除 然后重新打开虚拟机便可进入 问题解决

  4. HtmlHelper的扩展分页方法

    一.新建一个空MVC项目,命名为MVCAppPager 二.新建一个文件夹PageHelper,在文件夹下新建接口IPageList以及实现类PageList IPageList接口: public ...

  5. SQL函数-str()

    1 str()函数用于将数值类型数据转换未字符类型. 2 str()函数语法 select str(数字类型的表达式[,表达式总长度][,小数点后面的位数]) 表达式总长度和小数点后面的位数为可选择参 ...

  6. cf B. Black Square

    B. Black Square time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  7. SQL语句查询数据库所有表和所有字段的详细信息(包括表描述和字段描述)

    select (case then ddd.value else '' end ) as "表名(中文)" --如果表名相同就返回空 , (case then d.name els ...

  8. 使用iframe在手机中嵌套页面

    使用iframe嵌套网页 <iframe id="show-iframes" frameborder="0" name="showHere&qu ...

  9. 如何修改Web.Config里面的值

    0.先添加 <add key="MAXNUM" value="6" /> 1.读取值 string maxNum = ConfigurationMa ...

  10. dreamweaver 8的替换功能

    dreamweaver 8的替换功能 下面教你用dreamweaver 8的替换功能来删除这些冗余代码. 查找范围:文件夹(然后选取你需要替换的文件夹) 搜索:源代码查找:\btppabs=" ...