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. [Python] Boolean Or "Mask" Index Arrays filter with numpy

    NumPy Reference: Indexing Integer array indexing Boolean array indexing Note: The expression a < ...

  2. Android-Volley网络通信框架(StringRequest &amp; JsonObjectRequest)

    1.回想 上篇对 Volley进行了简介和对它的学习目的与目标,最后,为学习Volley做了一些准备 2.重点 2.1 RequestQueue 请求队列的建立 2.2 学习 StringReques ...

  3. nginx和apache

    apache所占用的内存资源较多,并且处理较慢 apache的全部模块都支持动静态编译 apache对Fcgi的支持不好 apache不支持epoll apache相对于nginx是一个庞然大物 ng ...

  4. legend---一、如何实现js跳转到php页面

    legend---一.如何实现js跳转到php页面 一.总结 一句话总结:url还是同样的方式,只不过注意引号内嵌的时候的转义. 代码: onClick="javascript:if(con ...

  5. 洛谷P3807 【模板】卢卡斯定理exgcd

    题目背景 这是一道模板题. 题目描述 给定n,m,p(1\le n,m,p\le 10^51≤n,m,p≤105 ) 求 C_{n+m}^{m}\ mod\ pCn+mm​ mod p 保证P为pri ...

  6. Linux桌面词典 星际译王(StarDict)

    星际译王(StarDict)是利用GTK(GIMP TOOLKIT)开发的国际化的.跨平台的自由的桌面字典软件.它并不包含字典档,使用者须自行下载配合使用.它可以运行于多种不同的平台,如Linux, ...

  7. wangEditor - 轻量级web富文本编辑器(可带图片上传)

    业务需求: 通过后台编辑文章和图片,上传到前端界面,展示新闻消息模块.这个时候,需要一款简洁的编辑器,百度编辑器是最常用的一种,但是功能太过于复杂,而wangEditor - 轻量级web富文本编辑器 ...

  8. Springboot 获取yml、properties参数

    获取properties或yml文件的配置数据(两种方法)(默认的application文件或者自定义的yml和properties) 1.使用@Value()注解 1.1 配置数据 如:在prope ...

  9. 洛谷——P1043 数字游戏

    https://www.luogu.org/problem/show?pid=1043 题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要 ...

  10. 【iOS开发-27】解决方式:An error was encountered while running(Domain=FBSOpenApplicationErrorDomain, Code=4)

    iOS simulator出现故障,提示: An error was encountered while running (Domain = FBSOpenApplicationErrorDomain ...