金贡和小天一起上去厕所(单人卫生间),小天先进去了,金贡一来也要上厕所,如果此时没锁门的话,金贡进去,阿西吧**********(此处省略300字),小天换裤子去了。若是此时小天把门锁上了,金贡换裤子去了。所以,卫生间装把锁是多么重要的事情啊。
锁:当一个线程执行操作的时候其他线程外面等待。
synchronized就是这个锁。
一.同步代码快.
synchronized(同步对象){
同步代码操作;
}
class MyThread2 implements Runnable{
private int ticket=10;
@Override
public void run() {
synchronized (this) {//上锁
while(true){
if(this.ticket>0){
try {
Thread.sleep(100); //模拟网络延迟
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"+卖票,ticket="+this.ticket--);
}else{
System.out.println("*******票已被抢光*******");
break;
}
}
}
}
}
public class ThreadDemo1 {
public static void main(String[] args) throws InterruptedException{
MyThread2 mt=new MyThread2();
new Thread(mt,"票贩子A").start();
new Thread(mt,"票贩子B").start();
new Thread(mt,"票贩子C").start();
}
}
票贩子A+卖票,ticket=10
票贩子A+卖票,ticket=9
票贩子A+卖票,ticket=8
票贩子A+卖票,ticket=7
票贩子A+卖票,ticket=6
票贩子A+卖票,ticket=5
票贩子A+卖票,ticket=4
票贩子A+卖票,ticket=3
票贩子A+卖票,ticket=2
票贩子A+卖票,ticket=1
*******票已被抢光*******
*******票已被抢光*******
*******票已被抢光*******
二.同步方法
class MyThread2 implements Runnable{
private int ticket=10;
public synchronized boolean sale(){
if(this.ticket>0){
try {
Thread.sleep(100); //模拟网络延迟
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"+卖票,ticket="+this.ticket--);
return true;
}else{
System.out.println("*******票已被抢光*******");
return false;
}
}
@Override
public void run() {
synchronized (this) {//上锁
while(this.sale()){
this.sale();
}
}
}
}
public class ThreadDemo1 {
public static void main(String[] args) throws InterruptedException{
MyThread2 mt=new MyThread2();
new Thread(mt,"票贩子A").start();
new Thread(mt,"票贩子B").start();
new Thread(mt,"票贩子C").start();
}
}
两种方法结果一样。
加入同步之后会造成性能的降低。