1.线程同步 博客园 基本参考 洞庭散人《浅谈java多线程的同步问题》
我们在使用多线程打印出一组数据会比较的混乱,所以在这里就引入了线程同步的概念。 java中使用关键字synchronized来实现线程的同步。当一个方法或者对象用synchronized修饰的时候,表明该方法或者对象在任意时刻只能由一个线程进行访问,其他线程只要调用CPU控制权且引起阻塞的原因消除后,才能被调用。
当一个方法或者对象使用synchronized关键字声明时,系统就为其设置一特殊的内部标记,称为锁,当一个线程调用该方法或对象的时候,系统都会检查锁是否已经给其他线程了,如果没有,系统就把该锁给它,如果该锁已经被其他线程占用了,那么该线程就要等到锁被释放以后,才能访问该方法。有时,需要暂时释放锁,使得其他线程可以调用同步方法,这事就可以利用wait()方法来实现。wait()方法可以使持有锁的线程暂时释放锁,直到其他线程通过notify方法使他重新获得该锁为止。
java语言中的线程同步通常有方法同步和对象同步两种情况,下面详细阐述这两种线程的同步情况。
1.方法同步
一个类中的任何方法都可以设计成为synchronized方法。下面通过一个例子来说明线程是如何同步的(代码手写,没调试,有错误自行改正).
public class Mymain {
public static void main(String[] args)
{
for(int i=0;i<10;i++){
new Thread(new MyThread(i)).start();
new Thread(new MyThread(i)).start();
}
}
public synchronized static void save(int id)
{
try {
Thread.sleep(2000);
System.out.println(id);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class MyThread implements Runnable
{
private int Str;
public MyThread(int s)
{
this.Str=s;
}
@Override
public void run() {
// TODO Auto-generated method stub
Mymain.save(Str);
}
}
2.对象同步
synchronized除了像上面讲的放在方法前面表示整个方法为同步之外,还可以放在对象前面限制一段代码的执行,实现对象的同步(代码手写,没调试,有错误自行改正).
public class Mymain {
public static void main(String[] args)
{ Object obj=new Object();
for(int i=0;i<10;i++){
new Thread(new MyThread(i,obj)).start();
new Thread(new MyThread(i,obj)).start();
}
}
}
class MyThread implements Runnable
{
private int Str;
private Object obj;
public MyThread(int s,Object obj)
{
this.Str=s;
this.obj=obj;
}
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (obj) {
try {
Thread.sleep(2000);
System.out.println(Str);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
线程同步的两种基本方法在这里就介绍完了,如果想了解更多的线程同步方法大家可以去百度上搜搜,可以看到方法还是多种多样的,我们学习不在学的多,而在于精,以后可以熟练的使用即可。 线程既然有同步操作那么大家很容易想到线程的异步吧。请看下一章 异步线程。
}