1.线程状态

  

如上图,当我们新建一个线程,并start后,其实不一定会马上执行,因为只有操作系统调度了我们的线程,才能真正进行执行,而操作系统也随时可以运行其他线程,这时线程又回到可运行状态。这个过程是操作系统控制的,不是我们能控制的。我们能控制的是将线程变为blocked,并从blocked变为runable状态。

在以前实验的wait和notify中,我当时并没有注意到notify后会进行锁阶段,以为notify后直接进入runable状态,等待操作系统调度。  从上面的图中可以看到,我们notify后,实际现场进入了locked状态,一个线程时就直接进入runable状态了,但是在多线程的情况下,因为我们wait或者notify时都是在同步中做的,只有获得同步锁的线程才有机会进入runable,其他线程还得等待。

因此在这里主要是学习一下锁的原理

2.锁

  1).内置锁

    java的每个对象都可以用作一个同步锁,这个锁就是内置锁,或者监视锁,通过同步方法或者代码块获得内置锁,也就是运用synchronized关键字字

2).显示锁

    jdk提供的高级锁,比如Lock、Condition等,主要用于内置锁不方便实现的功能

3.锁的一些特性

  1).可重入

    java线程时基于每线程计算锁的,在同一个线程中,可以再次进入该同步方法,而不会造成死锁。进入一次计数器加1,退出后减1。

/**
* 同步方法
* @author tomsnail
* @date 2015年4月18日 下午12:15:30
*/
public synchronized void test1(){
test1();
}

2).公平/非公平

    在公平的情况下,所有需要获得锁的线程,都有相同几率获得锁,反之,某些线程可以优先获得锁。

    /**
* Creates an instance of {@code ReentrantLock}.
* This is equivalent to using {@code ReentrantLock(false)}.
*/
public ReentrantLock() {
sync = new NonfairSync();
} /**
* Creates an instance of {@code ReentrantLock} with the
* given fairness policy.
*
* @param fair {@code true} if this lock should use a fair ordering policy
*/
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
ReentrantLock锁的构造方法,就提供了公平/非公平的机制,而synchronized没有明确的公平/非公平性保证,因为是操作系统就行调度的。公平锁和非公平锁的具体实现和原理,以后再好好学习一下。

4.死锁

java因为是线程级别的,我借用进程的死锁:是指多个线程循环等待其他线程占用的资源而无限期的僵持下去的局面。

死锁产生的必要条件:

a).互斥条件

    某个资源在一段时间内,只能由一个线程占用

b).不可抢占条件

在该资源没有被释放前,其他线程不能抢占

c).占用且申请条件

该线程已经占有一个资源,但是又申请新的资源,但要申请的资源被其他线程占用

d).循环等待条件

多个线程等待其他线程释放资源

public class DeadLockThread {
static final String a = "a";
static final String b = "b"; public static void main(String[] args) {
Thread a = new Thread(new DeadLockThread1());
Thread b = new Thread(new DeadLockThread2());
a.start();
b.start();
}
} class DeadLockThread1 implements Runnable{ @Override
public void run() {
testb();
} public void testa(){
synchronized (DeadLockThread.a) {
System.out.println(DeadLockThread.a);
}
} public void testb(){
synchronized (DeadLockThread.b) {
System.out.println(DeadLockThread.b); testa();
}
} } class DeadLockThread2 implements Runnable{ @Override
public void run() {
testa();
} public void testa(){
synchronized (DeadLockThread.a) { System.out.println(DeadLockThread.a);
testb();
}
} public void testb(){
synchronized (DeadLockThread.b) {
System.out.println(DeadLockThread.b);
}
} }

当上面四个条件同时满足时,就会产生死锁。

当产生死锁的时候,我们破坏掉上面的四个条件就可以了。

重学JAVA基础(八):锁的基本知识的更多相关文章

  1. 重学JAVA基础(七):线程的wait、notify、notifyAll、sleep

    /** * 测试thread的wait notify notifyAll sleep Interrupted * @author tomsnail * @date 2015年4月20日 下午3:20: ...

  2. 重学JAVA基础(六):多线程的同步

    1.synchronized关键字 /** * 同步关键字 * @author tomsnail * @date 2015年4月18日 下午12:12:39 */ public class SyncT ...

  3. 重学JAVA基础(五):面向对象

    1.封装 import java.util.Date; public class Human { protected String name; protected BirthDay birthDay; ...

  4. 重学JAVA基础(二):Java反射

        看一下百度的解释:       JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息     ...

  5. 重学JAVA基础(一):PATH和CLASSPATH

    我想大多数Java初学者都会遇到的问题,那就是怎么配置环境,执行java -jar xxx.jar  都会报NoClassDefFindError,我在最开始学习的时候,也遇到了这些问题. 1.PAT ...

  6. 重学JAVA基础(四):线程的创建与执行

    1.继承Thread public class TestThread extends Thread{ public void run(){ System.out.println(Thread.curr ...

  7. 重学JAVA基础(三):动态代理

    1.接口 public interface Hello { public void sayHello(); } 2.实例类 public class Hello2 { public void sayH ...

  8. 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员‍‍的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...

  9. 12天,这本《重学Java设计模式》PDF书籍下载量9k,新增粉丝1400人,Github上全球推荐榜!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言

随机推荐

  1. 关于git新建本地分支与远程分支关联问题

    背景 新建本地分支并推送到远端后,当前分支没有与远端分支关联,每次推送都需要填写一堆信息. 操作 git branch --set-upstream-to=origin/20160928 切换到本地分 ...

  2. easyui中tree使用simpleData的形式加载数据

    了解了zTree的使用, 发现它的simpleData是非常好用的, 由后台返回一个扁平数据, 直接在前台解析成树形菜单, 网上查了一下, easyui也可以简单实现, 不过....没看懂, 先记录一 ...

  3. C++主要数据类型在计算机中所占字节大小

    遇到了数据存储的大端和小端问题,这你妹的看的一头雾水,发现我基本知识严重匮乏啊,先了解C++各数据类型在自己机子上占多少字节吧,以及这些数据类型所占字节大小与神马有关.各种查资料然后写代码检验,小结于 ...

  4. Activity使用startActivityForResult时出现onActivityResult()不执行的问题

    通过使用 startActivityForResult() 和 onActivityResult() 方法可以在Activity之间传递或接收参数.但有时候我们会遭遇onActivityResult( ...

  5. ABP的数据过滤器(Data Filters)

    http://www.aspnetboilerplate.com/Pages/Documents/Data-Filters 我们在数据库开发中,一般会运用软删除 (soft delete)模式 ,即不 ...

  6. shell 小问题汇总

    写脚本的时候难免会判断变量是否为空或者为定义 变量a未定义 if [ -n $a ];then echo "exists"; else echo "not exists& ...

  7. Centos6.X下安装php nginx mysql 环境

    ---------------------------------------更换163软件源,此步可以省略,记得把repo文件里面的6.5改成当前版本号 yum makecache &&am ...

  8. NET Framework 4.0的安装失败处理

    如果是XP系统,这么做:1.开始——运行——输入cmd——回车——在打开的窗口中输入net stop WuAuServ2.开始——运行——输入%windir%3.在打开的窗口中有个文件夹叫Softwa ...

  9. 【java】:通用接口

    电商接口 京东获取单个商品价格接口: http://p.3.cn/prices/mgets?skuIds=J_商品ID&type=1 用例 ps:商品ID这么获取:http://item.jd ...

  10. 数据模型类对比 反射c#

    using System;using System.ComponentModel.DataAnnotations; public class LoginModel    {               ...