- 同步控制:是指同一资源只能同时被一个对象调用,当这个对象调用结束后才能被其他的对象调用
- 在所要调用的方法前加上synchronized
- 例:synchronized char get(){};
*注意的是:1.当用synchronized注释多个方法的时候,使得这些方法“连在一起”
- 当有一对象调用其中的一个方法的时候,别的对象无法对其他的方法进行调用
-
- 2.标识的资源可以是一种类型的数据,也就是对象,也可以是一个方法,也可以是一段代码
- 当我们对整个类进行标识的时候,就会使得这类之中的所有的东西同一时间只能被一个对象调用
-
- 3.当我们编写程序的时候最好将定义同步的类和实现其他的方法的类分开,以免弄混,使得程序出错
/**
* @Author 李腾飞
*/
class Common{//定义同步资源
private char ch;
private boolean available=false;
synchronized char get(){
while(available==false)
try
{
wait();//当没有产品时,一直挂起,不能进行售卖
}
catch (InterruptedException e){}
available=false;
notify();
return ch;
}
synchronized void put(char newch){//当对象调用这个方法的时候就会得到互斥锁,使之避免多个线程对同一自资源的访问
while(available==true)
try
{
wait();//当有产品的时候,就一直挂起,不进行上架
}
catch(InterruptedException e){}
ch=newch;
available=true;
notify();
}
}
class Produce extends Thread {
private Common comm;
public Produce(Common thiscomn){
comm=thiscomn;
}
public void run(){
char c;
for (c='a';c<'e';c++){
System.out.println("生产的数据是:"+c);
comm.put(c);
}
}
}
class Consumer implements Runnable{
private Common comm;
public Consumer(Common thisComm) {
comm = thisComm;
}
public void run(){
char c;
for (int i=0; i<5;i++){
c=comm.get();
System.out.println("消费者得到的数据是:"+c);
}
}
}
public class 线程同步控制 {
public static void main(String[] args) {
Common comm = new Common();
Produce p = new Produce(comm);
Consumer c = new Consumer(comm);
p.start();
new Thread(c).start();//注意此时的激活程序只能放在main函数之中
}}
注意激活线程时的注意点:
Consumer v=new Consumer(comm);
此时的V虽然是实现Runnable接口的类的对象,但是Thread之中的很多方法却不能够进行使用
想要使用 Thread的方法就要重新定义一个Thread线程,将所建的对象作为参数放入其中
此时参数的run()方法就会被线程所调用
new Thread(v).start();//创建Thread类的匿名对象,将v作为参数放入其中,再调用start方法将线程激活