您的位置:首页 > 编程语言 > Java开发

java多线程-线程同步

2016-05-12 21:16 309 查看

同步与死锁

1、同步代码块

在代码块前面加上“synchronized”关键字,则此代码块称为同步代码块

2、同步代码块格式

synchronized(同步对象){

需要同步的代码块;

}

3、同步的方法

代码块可以同步,方法也是可以同步的

4、方法同步格式:

synchronized void 方法名称(){}

实例:三个窗口卖五张车票

不适用同步时的情况

package ThreadTest;
//三个窗口卖5张车票
class MyThreadDemo implements   Runnable{
//五张车票
private int ticket=5;
public void run() {
for(int i=0;i<10;i++){
//当车票还有的时候,才会有人在排队买票
if(ticket>0){
try {
//买票等待时间,每个人等五百毫秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("车票"+ticket--);
}
}
}
}
public class ThreadDemo05 {
public static void main(String[] args) {
MyThreadDemo my=new MyThreadDemo();
//三个窗口创建三个线程对象
Thread t1=new Thread(my);
Thread t2=new Thread(my);
Thread t3=new Thread(my);
t1.start();
t2.start();
t3.start();
}
}
输出结果
车票5
车票5
车票5
车票4
车票3
车票2
车票1
车票-1
车票0


车票出现了负数,显然与事件不符,此时就是因为资源没法共享,没法同步导致的

那我们加入同步

package ThreadTest;
//三个窗口卖5张车票
class MyThreadDemo implements   Runnable{
//五张车票
private int ticket=5;
public void run() {
for(int i=0;i<10;i++){
//加入同步
synchronized (this) {
//当车票还有的时候,才会有人在排队买票
if(ticket>0){
try {
//买票等待时间,每个人等五百毫秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("车票"+ticket--);
}
}
}
}
}
public class ThreadDemo05 {
public static void main(String[] args) {
MyThreadDemo my=new MyThreadDemo();
//三个窗口创建三个线程对象
Thread t1=new Thread(my);
Thread t2=new Thread(my);
Thread t3=new Thread(my);
t1.start();
t2.start();
t3.start();
}
}

输出结果
车票5
车票4
车票3
车票2
车票1


还可以使用同步方法

package ThreadTest;
//三个窗口卖5张车票
class MyThreadDemo implements   Runnable{
//五张车票
private int ticket=5;
public void run() {
for(int i=0;i<10;i++){
//调用sell()方法
sell();
}
}
//加上同步方法
public synchronized void sell(){
//当车票还有的时候,才会有人在排队买票
if(ticket>0){
try {
//买票等待时间,每个人等五百毫秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("车票"+ticket--);
}
}
}
public class ThreadDemo05 {
public static void main(String[] args) {
MyThreadDemo my=new MyThreadDemo();
//三个窗口创建三个线程对象
Thread t1=new Thread(my);
Thread t2=new Thread(my);
Thread t3=new Thread(my);
t1.start();
t2.start();
t3.start();
}
}
输出结果:
车票5
车票4
车票3
车票2
车票1


死锁

举个例子:

死锁:毕业生找工作(高新)

企业需要你有经验才会给高新(经验),这两者互相冲突

解决这个问题的方法就是毕业生降低薪水预期,企业培养你经验
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: