Java多线程及同步实现原理 - 编程入门网
{ Thread.sleep(100); } catch(InterruptedException e) { System.out.println("Interrupted"); } } } public static void main(String[] args) { TestThread testThread = new TestThread(); for(int i=0; i<5; i++) //new Thread(testThread, "t" + i).start(); (1) new Thread(new TestThread(), "t" + i).start(); (2) }}
运行结果为: t0 : 0 t1 : 0 t2 : 0 t3 : 0 t4 : 0 t0 : 1 t1 : 1 t2 : 1 t3 : 1 t4 : 1 t0 : 2 t1 : 2 t2 : 2 t3 : 2 t4 : 2 t0 : 3 t1 : 3 t2 : 3 t3 : 3 t4 : 3 t0 : 4 t1 : 4 t2 : 4 t3 : 4 t4 : 4 由于代码(2)每次都是用一个新的TestThread对象来产生Thread对象的,所以产生出来的Thread对象是不同对象的线程,所以所有Thread对象都可同时访问run()函数。如果注释掉代码(2),并去掉代码(1)的注释,结果为: t0 : 0 t0 : 1 t0 : 2 t0 : 3 t0 : 4 t1 : 0 t1 : 1 t1 : 2 t1 : 3 t1 : 4 t2 : 0 t2 : 1 t2 : 2 t2 : 3 t2 : 4 t3 : 0 t3 : 1 t3 : 2 t3 : 3 t3 : 4 t4 : 0 t4 : 1 t4 : 2 t4 : 3 t4 : 4 由于代码(1)中每次都是用同一个TestThread对象来产生Thread对象的,所以产生出来的Thread对象是同一个对象的线程,所以实现run()函数的同步。 Java多线程及同步实现原理(5)时间:2007-11-05二. 共享资源的同步 1. 同步的必要性 例4: class Seq{ private static int number = 0; private static Seq seq = new Seq(); private Seq() {} public static Seq getInstance() { return seq; } public int get() { number++; //(a) return number; //(b) }}public class TestThread{ public static void main(String[] args) { Seq.getInstance().get(); //(1) Seq.getInstance().get(); //(2) }}
上面是一个取得序列号的单例模式的例子,但调用get()时,可能会产生两个相同的序列号: 当代码(1)和(2)都试图调用get()取得一个唯一的序列。当代码(1)执行完代码(a),正要执行代码(b)时,它被中断了并开始执行代码(2)。一旦当代码(2)执行完(a)而代码(1)还未执行代码(b),那么代码(1)和代码(2)就将得到相同的值。 2. 通过synchronized实现资源同步 2.1 锁标志 2.1.1 每个对象都有一个标志锁。当对象的一个线程访问了对象的某个synchronized数据(包括函数)时,这个对象就将被“上锁”,所以被声明为synchronized的数据(包括函数)都不能被调用(因为当前线程取走了对象的“锁标志”)。只有当前线程访问完它要访问的synchronized数据,释放“锁标志”后,同一个对象的其它线程才能访问synchronized数据。 2.1.2 每个class也有一个“锁标志”。对于synchronized static数据(包括函数)可以在整个class下进行锁定,避免static数据的同时访问。 例5: class Seq{ private static int number = 0; private static Seq seq = new Seq(); private Seq() {} public static Seq getInstance(){ return seq; } public synchronized int get() { //(1) number++; return number; }}
例5在例4的基础上,把get()函数声明为synchronized,那么在同一个对象中,就只能有一个线程调用get()函数,所以每个线程取得的number值就是唯一的了。 Java多线程及同步实现原理(6)时间:2007-11-05例6: class Seq{ private static int number = 0; private static Seq seq = null; private |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |