线程同步
1.使用同步代码块
public void run(){
while(true){
//把需要同一个线程一次执行完的代码放入同步代码块中
synchronized(Object.class){
if(TestThread1.i<10){
System.out.println(Thread.currentThread().getName()+":"+TestThread1.i++);
}else{
break;
}
}
}
}
必须保证锁的唯一性
2.使用同步方法
//使用同步方法实现线程的同步
public synchronized void synchronizedMethod(){
if(TestThread1.i<10){
System.out.println(Thread.currentThread().getName+":"+TestThread1.i++);
}
}
思考:锁是啥?
a.这是一个成员方法:锁是this
b.这是一个静态方法:锁是这个类的class对象
线程的通信
wait
notifyAll
//把需要同一个线程一次执行完的代码放入同步代码块中
sysnchronized(Object.class){
//把其他线程叫醒
Object.class.notifyAll();
if(i<10){
System.out.println(Thread.currentThread().getName()+":"+i++);
}else{
break;
}
//等待,调用锁的wait方法
try{
Object.class.wait();
}catch(Exception e){
e.printStackTrace();
}
}
线程的死锁:两个锁的位置内外交换,两个线程都不能继续执行。
public void run(){
while(true){
synchronized(Object.class){
if(TestThread1.i<10){
synchronized(Integer.class){
System.out.println(Thread.currentThread().getName+":"+TeatThread1.i++);
}
}else{
break;
}
}
}
}
@Override
public void run(){
while(true){
synchronized(Integer.class){
if(TestThread1.i<10){
synchronized(Object.class){
System.out.println(Thread.currentThread().getName()+":"+TestThread1.i++);
}
}else{
break;
}
}
}
}
sleep 和wait的区别
1.sleep不会释放锁,wait会释放锁
2.sleep是thread的方法
3.wait是object的方法