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. 【 Beginning iOS 7 Development《精通iOS7开发》】05 Autorotation and Autosizing

    一.旋转后相对位置不变 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ29nbGVy/font/5a6L5L2T/fontsize/400/fill/I0 ...

  2. Linux系统编程——进程间通信:信号中断处理

    什么是信号? 信号是 Linux 进程间通信的最古老的方式.信号是url=474nN303T2Oe2ehYZjkrggeXCaJPDSrmM5Unoh4TTuty4wSgS0nl4-vl43AGMFb ...

  3. strchr函数的实现而不是使用

    刚刚在写一个程序的时候突然须要用到定位到一个字符串中第一次出现某个字符的位置,于是就找到了strchr()函数,之前从没实用过的,^_^当然我能够直接调用就可以.可是拥有良好程序素质的洗衣袋决定要想实 ...

  4. mysql二进制日志文件出错导致mysql服务无法启动

    今天打开phpmyadmin发现连不上mysql数据库,重新启动mysql启动不起来,查看日志发现例如以下错误 <span style="font-family:SimSun;font ...

  5. javascript 左侧菜单

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Red Hat Linux 安装 (本地、网络安装)

    Red Hat Linux 安装 (本地.网络安装) 650) this.width=650;" onclick='window.open("http://blog.51cto.c ...

  7. HTML中常用的部分标签(一)

    [常见的块级标签] 标题标签<h1></h1>...<h6></h6> 水平线<hr/> 段落<p></p> 换行& ...

  8. GCJ1C09C - Bribe the Prisoners

    GCJ1C09C - Bribe the Prisoners Problem In a kingdom there are prison cells (numbered 1 to P) built t ...

  9. PHP的模板引擎smarty原理是什么(整理)

    PHP的模板引擎smarty原理是什么(整理) 一.总结 一句话总结:其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者混合为一个ph ...

  10. 51.cgi网站后门

    运行截图: html开发: <html> <body> <form id="form" name="form" method=&q ...