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. 5.HotSpot的算法实现

    1.枚举根节点 在可达性分析中,可以作为GC Roots的节点有很多,但是现在很多应用仅仅方法区就有上百MB,如果逐个检查的话,效率就会变得不可接受. 而且,可达性分析必须在一个一致性的快照中进行-即 ...

  2. 解决KDE桌面环境下Eclipse崩溃的问题--让Eclipse使用特定的GTK2主题运行

    最近在Kubuntu14.04上安装Eclipse,由于Ubuntu软件中心中的版本太老(3.8),而且会自动安装OpenJDK,于是到官网下载最新的4.4版.(Luna,代号很有亲切感有木有,女神万 ...

  3. good excel website

    http://www.codematic.net/excel-tools/free-excel-tools.htm

  4. iOS(OC)中的冒泡排序

    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"12",@"84", @"35& ...

  5. 关于java中线程休眠的另一种写法

    编辑器加载中... 优先使用TimeUnit类中的sleep() TimeUnit是什么? TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的 ...

  6. 重载new和delete

    当我们创建一个new表达式时,会发生两件事.首先使用operator new()分配内存,然后调用构造函数.在delete表达式里,调用了析构函数,然后使用operator delete()释放内存. ...

  7. java内部类和匿名内部类

    内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.clas ...

  8. C++混合编程之idlcpp教程(一)

    我是C++语言的忠实拥趸,由于在上学时经历了资源匮乏的DOS时代,对C/C++这种更加接近硬件的语言由衷的喜爱.一直以来也是已C++作为工作的语言,对别的语言那是不屑一顾.在java火爆流行的时候,没 ...

  9. Data层相关问题 & JS循环取值

    第一次写博客,里面是自己工作中碰到的问题及总结的知识点,便于自己以后回顾,技术大牛们请直接忽略这篇文章,也希望能帮助到想我这样的小白! Data层相关问题总结: 1. 代码管理用的是 VSS 2005 ...

  10. [ASE]Sprint1总结 & Sprint2计划

    经历了两周的团队项目,我们进行了一个简单的总结: 对TFS不够重视,第一周几乎没有使用TFS,第二周大部分是将完成了的工作添加到TFS当中. 这也反映了一个问题,就是对项目细节的安排不到位,最开始的时 ...