实现线程同步
由于同一进程的多个线程共享同一块存储空间,在带来方便的同时,也带来了访问冲突的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程访问造成的这种问题。这套机制就是synchronized关键字。
synchronized语法结构:
synchronized(锁对象){
同步代码
}
synchronized关键字使用时需要考虑的问题:
需要对那部分的代码在执行时具有线程互斥的能力(线程互斥:并行变串行)。
需要对哪些线程中的代码具有互斥能力(通过synchronized锁对象来决定)。
它包括两种用法:synchronized方法和synchronized块。
synchronized方法
通过在方法声明中加入synchronized关键字来声明,语法如下:
public synchronized void accessval(int newVal);
synchronized在方法声明时使用:放在访问控制符(public)之前或之后。这时同一个对象下synchronized方法在多线程中执行时,该方法是同步的,即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchroized方法内部的线程)执行完该方法后,别的线程才能进入。
synchronized块
synchronized方法的缺陷:若将一个大的方法声明为synchronized将会大大影响效率。
Java为我们提供了更好的解决办法,那就是synchronized块。块可以让我们精确地控制到具体地“成员变量”,缩小同步地范围,提高效率。