第十一天·synchronized
线程的生命周期
线程常用方法:
void run():创建该类的子类时必须实现的方法
void start():开启线程的方法
static void sleep(long t):释放CPU的执行权,不释放锁
static void sleep(long millis,int nanos):
final void wait():释放CPU的执行权,释放锁
final void notify():
static void yied():可以对当前线程进行临时暂停((让
线程将资源释放出来)
synchronized 锁的使用方法
synchronized (对象){加锁的代码};
注意加锁会降低效率,所以说存在一个加锁层级的问题
- 代码锁:–>对代码级进行加锁
- 方法锁:对方法进行加锁:protected synchronized void onCreate(Bundle
对象锁:对对象的所有资源进行加锁
synchronized后面传的参数是加锁对象,就是讲锁与这个对象绑定,
锁并不单独存在,一个对象只能绑定一个锁创建一千个线程,每个都是对这个数进行加1
package com.xiaogao.user.android2lesson_11_threadpool;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
public class ActivityS extends AppCompatActivity {
//创建一个静态的变量用于各个线程进行加减--synchronized
static int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建一千个线程,每个都是对这个数进行加1
for (int i=0;i<1000;i++){
new Thread(new Runnable() {
@Override
public void run() {
synchronized (this){
count=count+1;
}
}
}).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//打印下结果,看看结果是怎样
Log.i("数据","测试结果为:"+count);
}
}
volatile
- volatile可以保证对特殊地址的稳定访问。
- volatile关键字为域变量的访问提供了一种免锁机制
- 使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更
新 - 因此每次使用该域就要重新计算,而不是使用寄存器中的值
- volatile不会提供任何原子操作,它也不能用来修饰final类型的
变量
//声明一个免锁的实时更新数据对象----------volatile
volatile static int count1 = 0;