Java中的线程---基础知识

2016-12-01  本文已影响110人  Elder

今天刚刚参加了一次面试,被面试官的关于线程的提问生生碾压了。重整旗鼓,总结一下关于线程的基础知识,相信也可以帮到一批小伙伴的。首先分享一下基础知识。南玻万:0

线程与进程的区别

区别详解请移步链接中的文章已经把区别整理的很完善了,同学们可以自行移步查看。我在这里写一下我自己总结的它们之间的区别:

线程的状态

下面这张图片展示了线程的所有状态和状态之间的互相转换:


线程状态图

同步锁(synchonrize)的介绍

相信很多同学应该都和我差不多只知道这个关键字的简单实用,对于很多细节其实并不是很清楚,这里我同大家一起分享关于同步锁的正确使用。
首先我们大家都应该知道每个对象都有一个锁标志,被synchonrize关键字修饰的变量或方法将被上锁,同一时刻只能被单一线程访问。当前线程访问完数据后释放锁标志,其他线程才可以进行访问。这里还需要给大家补充一下线程常用方法与同步锁之间存在的关系,以下表格可以清晰的展示这一点:

方法 是否释放锁 备注
wait wait和notify/notifyAll是成对出现的, 必须在synchronize块中被调用
sleep 可使低优先级的线程获得执行机会
yield yield方法使当前线程让出CPU占有权, 但让出的时间是不可设定的

对以上方法的备注我还引入一些更具体的解释(点击给进入原作者的文章)。如下:

这三个方法用于协调多个线程对共享数据的存取,wait()有出让Object锁的语义, 要想出让锁, 前提是要先获得锁, 所以要先用synchronized获得锁之后才能调用wait(), notify原因类似。
wait()方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

同步锁(synchonrize)的使用

synchronize关键字主要有下面5种用法

  1. 在方法上进行同步, 分为(1)instance method/(2)static method, 这两个的区别后面说
  2. 在内部块上进行同步, 分为(3)synchronize(this), (4)synchonrize(XXX.class), (5)synchonrize(mutex)

代码示例如下:

private int value = 0;
private final Object mutex = new Object();
public synchronized int incAndGet0() {
       return ++value;
 }
public static synchonrize int incAndGet1();
 public int incAndGet2() {
        synchronized(this){
            return ++value;
        }
    }
public int incAndGet3() {
       synchronized(SyncMethod.class){
            return ++value;
        }
    }
public int incAndGet4() {
       synchronized(mutex){
            return ++value;
        }
    }

  1. 作为修饰符加在方法声明上, synchronized修饰非静态方法时表示锁住了调用该方法的堆对象, 修饰静态方法时表示锁住了这个类在方法区中的类对象。
  1. synchronized(X.class) 使用类对象作为监控。 同一时间只有一个线程可以能访问块中资源。
  2. synchronized(this)和synchronized(mutex) 都是对象锁, 同一时间每个实例都保证只能有一个实例能访问块中资源。

以上就是关于synchonrize关键字的基础知识。其他还有一些关于synchronized和volatile比较synchonrize和juc中的锁比较
这里也简单介绍一下:

当且仅当下面条件全部满足时, 才能使用volatile

  1. 对变量的写入操作不依赖于变量的当前值, (++i/i++这种肯定不行), 或者能确保只有单个线程在更新
  1. 该变量不会与其他状态变量一起纳入不变性条件中
  2. 访问变量时不需要加锁

以上就是这两种锁的比较的简单介绍,想要深入学习的同学请大家自行搜索学习吧。最后送给正在进行面试同学们的一句话:面试官虐我千百遍,我待面试官如初恋。---必须正能量,清喷。

上一篇下一篇

猜你喜欢

热点阅读