Java学习笔记四
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学习笔记四的更多相关文章
- Java学习笔记四---打包成双击可运行的jar文件
写笔记四前的脑回路是这样的: 前面的学习笔记二,提到3个环境变量,其中java_home好理解,就是jdk安装路径:classpath指向类文件的搜索路径:path指向可执行程序的搜索路径.这里的类文 ...
- Java学习笔记四:Java的八种基本数据类型
Java的八种基本数据类型 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. Java基本类型共有八种,基本类型可以分为三类,字符类型char,布 ...
- Java学习笔记四——运算符
算术运算符 加减乘除(+.-.*./)就不说了. 求余运算符% 描述:第一个操作数除以第二个操作数,得到一个整除的结果后剩下的值就是余数 注意:求余预算的结果不一定总是整数,当操作数是浮点数时,结果可 ...
- Java 学习笔记 (四) Java 语句优化
这个问题是从headfirst java看到的. 需求: 一个移动电话用的java通讯簿管理系统,要求最有效率的内存使用方法. 下面两段程序的优缺点,哪个占用内存更少. 第一段: Contact[]c ...
- Java学习笔记四:三目运算符与字符串连接符等
一 .三目运算符与自增自减 GitHub代码练习地址:https://github.com/Neo-ML/JavaPractice/blob/master/OperPrac02.java 条件运算符由 ...
- 面向对象三大特征之封装与static——(Java学习笔记四)
面向对象 编程本质:以类的方式组织代码,以对象的方式组织(封装)数据 对象:具体的事物,某个类的对象(实例) 类:是对对象的抽象,用于描述同一类型的对象的一个抽象概念 对象和类的关系:特殊到一 ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Java IO学习笔记四:Socket基础
作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...
随机推荐
- Linux打包免安装的Qt程序(编写导出依赖包的脚本copylib.sh,程序启动脚本MyApp.sh)
本文介绍如何打包Qt程序,使其在没有安装Qt的系统可以运行. 默认前提:另外一个系统和本系统是同一个系统版本. 1,编写导出依赖包的脚本copylib.sh #!/bin/bash LibDir=$P ...
- ISheet ICell
/// <summary> /// Gets the first row on the sheet /// </summary> /// <value>the nu ...
- js插件---图片裁剪cropImgBox(适合练习编写插件之用)
js插件---图片裁剪cropImgBox(适合练习编写插件之用) 一.总结 一句话总结:无论是灰度还是高对比度的图片,都是先处理canvas的像素,使其变成灰度或者高对比度,然后再用canvas.t ...
- Redis封装之String
RedisBase类 /// <summary> /// RedisBase类,是redis操作的基类,继承自IDisposable接口,主要用于释放内存 /// </summary ...
- SQL Server 2005高可用性模式下创建数据库镜像
SQL Server 2005高可用性模式下创建数据库镜像 高可用性模式下创建数据库镜像 第一步: --创建镜像用数据库-在主服务器上操作 create database db_mirror on ...
- RedHat Linux 多媒体学习指南 (共 36 部原创视频)
1.为sco unix 添加第二块网卡 [url]http://you.video.sina.com.cn/b/11695632-1443650204.html[/url] 2.为sco unix ...
- Python学习笔记 capture 1
最近开始学习Python3.x,真的感觉Python的语法与C++,Java有很大的不同,Python从某些方面来说语法更简单.Python作为一种解释性语言和编译型语言如C++来说,还是各有千秋的. ...
- BZOJ1367: [Baltic2004]sequence(左偏树)
Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Output 13 解题思路: 有趣的数学题. 首先确定序 ...
- struts2的acton标签中的ignoreContextParams属性和param子元素的冲突
<s:action ignoreContextParams="true" executeResult="true" name="login&qu ...
- 稀疏表示字典的显示(MATLAB实现代码)
本文主要是实现论文--基于稀疏表示的图像超分辨率<Image Super-Resolution Via Sparse Representation>中的Figure2.通过对100000个 ...