方法定义的完整格式。
访问权限{public |default|protected|private}[final][static][synchronized]返回值类型|void 方法名称(参数类型 参数名称,.....)[throws Exception1,Exception2]{return[返回值|返回用处]};
一个多线程的程序如果通过Runnable接口实现的,则意味着类中的属性将被多个线程共享,那么这多个线程要操作同一资源时就有可能出现资源同步问题。
就是假如我手里有三个汉堡,同一刻有四个小盆友来拿,我口头答应的时刻与给他们汉堡的时刻就是时间段。在同一刻时,我答应了他们四个,到了给汉堡的时刻,才发现我只有3个汉堡,这就是资源同步问题。
想解决此类问题,就必须使用同步。所谓的同步就是指多个操作在一个时间段内只有一个线程进行,其他线程等待此线程完成之后才可以继续执行。
解决资源共享的同步操作,可以使用同步代码块和同步方法两种方式完成。
1、同步代码块。
关键字synchronized。
public class MyThread04 implements Runnable {
private int ticket = 5;
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
synchronized (this) {
if (ticket > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("卖票:ticket=" + ticket--);
}
}
}
}
}
public class SyncDemo02 {
public static void main(String[] args) {
MyThread04 m = new MyThread04();
new Thread(m).start();
new Thread(m).start();
new Thread(m).start();
}
}
2、同步方法
就是使用synchronized关键字将一个方法声明成同步方法。
public class MyThread04 implements Runnable {
private int ticket = 5;
private synchronized void count() {
if (ticket > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("卖票:ticket=" + ticket--);
}
}
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
count();
}
}
}
死锁就是指两个线程都在等待对方先完成,造成了程序的停滞。
多个线程共享同一资源时需要进行同步,以保证资源操作的完整性,但是过多的同步就有可能产生死锁。