线程的生命周期:
新建 ----》就绪----》运行-----》阻塞----》死亡
为什么要使用同步:
java允许多线程并发控制,当多个线程同时操作一个可共享的资源变
量时(如数据的增删改),将会导致数据不准确,相互之间产生冲突,因
此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从
而保证了该变量的唯一性和准确性
一:
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:
1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
二:
volatile关键字,是对变量加锁的:
例子代码:
package com.coderqi.android2lesson_11_threadpool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
//创建一个静态的变量用于各个线程进行加载
static int count = 0;
//声明一个免锁的实时更新数据对象
volatile static int count1 = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建1000个线程,每个都是对这个数进行加1;
for (int i =0;i<1000;i++){
new Thread(new Runnable() {
@Override
public void run() {
//先让线程休眠1秒中
//synchronized 锁 使用方法
// synchronized(对象){
// 需要加锁的代码
// }
//注意:加锁会降低下效率,所以说,存在一个加锁层级的问题
//代码锁:对代码级进行加锁
//方法锁:对方法进行加锁
//对象锁:对对象所有的资源进行加锁
// synchronized 后面传的参数是加锁对象,就是将锁与对象绑定,
//锁并不单独存在,一个对象只能绑定一个锁
synchronized (this){
count = count +1;
}
count1++;
}
}).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//打印结果,看看结果怎样
Log.i("数据:","测试的结果:"+ count + "免锁的结果为" + count1);
//脏数据:不干净的数据
//不应该出现的数据或者和预期不一致的数据
}
}
线程池
最新推荐文章于 2022-06-13 12:13:16 发布