- synchronized
- 锁定的是对象,如果加在方法上则锁定的是this
- 要同步的多个线程必须锁定同一个对象
- 修饰方法和修饰代码块
没加锁的线程:
main函数:加没加锁主函数不变
public class SynChrromizeTest {
public static void main(String[] args) throws InterruptedException {
Move move = new Move(60);
Thread th1=new Thread(move,"搬砖1");
Thread th2=new Thread(move,"搬砖2");
th1.start();
th2.start();
Thread.sleep(1500);
System.out.println("还剩几块砖"+move.getCount());
}}
搬砖的类:加锁:就是在减方法内,添加synchronize
public class Move implements Runnable{
// 搬砖,为了使搬砖不会,有多个人把同一块砖,搬了多次
private int count;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public Move(int count) {
super();
this.count = count;
}
public Move() {
super();
// TODO Auto-generated constructor stub
}
/* synchronized */ void MovBricks() {
//加锁后,必须等一个方法执行完后才能执行
this.count--;
//搬砖的方法
}
@Override
public void run() {
for (int i = 0; i < 30; i++) {
MovBricks();
System.out.println(Thread.currentThread().getName()+":搬了第"+i+"砖");
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
怎么记忆synchronized这个单词:
syn chrom nice
取cyn chron nize
cyn chro n n ize
(两个n就是一个m)
线程同步:
1:范围不同:(锁方法,与锁方法里的代码块的区别:)
- 锁方法是整个方法不能被共同使用(锁的范围大)
- 锁代码块是方法里面只有一点点的代码需要被锁,加锁的前置或后置代码是不必要被锁的,可以提高被锁的效率
2:不同步可能出现的问题(竞态条件)
线程的生命周期
1:新建 NEW:new创建线程对象
2:就绪 : 调用start方法后,得到了除CPU时间以外的所有资源
3:运行 : 获得CPU时间,进入运行状态
4:阻塞/等待 : 遇到sleep、yield、wait等等
5:结束 : 中断或者执行结束
线程属性及常用方法
属性: name\id\priority\daemon
常用方法:
static currentThread
static sleep 休眠
yield
static dumpStack
join