您当前的位置:首页 > 互联网教程

浅谈Java多线程的同步问题

发布时间:2025-05-19 18:53:22    发布人:远客网络

浅谈Java多线程的同步问题

一、浅谈Java多线程的同步问题

1、多线程的同步依靠的是对象锁机制 synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问

2、下面以一个简单的实例来进行对比分析实例要完成的工作非常简单就是创建个线程每个线程都打印从到这个数字我们希望线程之间不会出现交叉乱序打印而是顺序地打印

3、先来看第一段代码这里我们在run()方法中加入了synchronized关键字希望能对run方法进行互斥访问但结果并不如我们希望那样这是因为这里synchronized锁住的是this对象即当前运行线程对象本身代码中创建了个线程而每个线程都持有this对象的对象锁这不能实现线程的同步

4、代码 package vista; class MyThread implements java lang Runnable{ private int threadId;

5、 public MyThread(int id){ this threadId= id;}

6、@Override public synchronized void run(){ for(int i=; i<;++i){ System out println( Thread ID:+ this threadId+:+ i);}}}

7、 public class ThreadDemo{/***@param args*@throws InterruptedException*/ public static void main(String[] args) throws InterruptedException{ for(int i=; i<;++i){ new Thread(new MyThread(i)) start(); Thread sleep();}}}

8、从上述代码段可以得知要想实现线程的同步则这些线程必须去竞争一个唯一的共享的对象锁

9、基于这种思想我们将第一段代码修改如下所示在创建启动线程之前先创建一个线程之间竞争使用的Object对象然后将这个Object对象的引用传递给每一个线程对象的lock成员变量这样一来每个线程的lock成员都指向同一个Object对象我们在run方法中对lock对象使用synchronzied块进行局部封锁这样就可以让线程去竞争这个唯一的共享的对象锁从而实现同步

10、 class MyThread implements java lang Runnable{ private int threadId; private Object lock;

11、 public MyThread(int id Object obj){ this threadId= id; this lock= obj;}

12、@Override public void run(){ synchronized(lock){ for(int i=; i<;++i){ System out println( Thread ID:+ this threadId+:+ i);}}}}

13、 public class ThreadDemo{/***@param args*@throws InterruptedException*/ public static void main(String[] args) throws InterruptedException{ Object obj= new Object(); for(int i=; i<;++i){ new Thread(new MyThread(i obj)) start(); Thread sleep();}}}

14、从第二段代码可知同步的关键是多个线程对象竞争同一个共享资源即可上面的代码中是通过外部创建共享资源然后传递到线程中来实现我们也可以利用类成员变量被所有类的实例所共享这一特性因此可以将lock用静态成员对象来实现代码如下所示

15、 class MyThread implements java lang Runnable{ private int threadId; private static Object lock= new Object();

16、 public MyThread(int id){ this threadId= id;}

17、@Override public void run(){ synchronized(lock){ for(int i=; i<;++i){ System out println( Thread ID:+ this threadId+:+ i);}}}}

18、 public class ThreadDemo{/***@param args*@throws InterruptedException*/ public static void main(String[] args) throws InterruptedException{ for(int i=; i<;++i){ new Thread(new MyThread(i)) start(); Thread sleep();}}}

19、再来看第一段代码实例方法中加入sychronized关键字封锁的是this对象本身而在静态方法中加入sychronized关键字封锁的就是类本身静态方法是所有类实例对象所共享的因此线程对象在访问此静态方法时是互斥访问的从而可以实现线程的同步代码如下所示

20、 class MyThread implements java lang Runnable{ private int threadId;

21、 public MyThread(int id){ this threadId= id;}

22、@Override public void run(){ taskHandler(this threadId);}

23、 private static synchronized void taskHandler(int threadId){ for(int i=; i<;++i){ System out println( Thread ID:+ threadId+:+ i);}}}

二、java 多线程的简单问题 基础知识

1、t=new Thread(this,name);这句话、

2、新建一个线程。。把自己和这个name作为参数传给他。。name你肯定明白。。你肯定是不明白那个this。。

3、 System.out.println("New threa:"+t);

4、这个构造方法创建的NewThread对象。。比如你在一个地方写

5、NewThread nt= new NewThread(“ds”);这样就会执行到这个构造方法里面去。。于是执行到这里后。。这里的this就是nt这个对象了。

6、thread类有一个构造方法接受一个Runnable类型和一个String类型的参数。。

7、启动通过这种方法创建的线程的话。。他会调用你传给他的Runnable里面的run方法。。

8、 System.out.println(name+":"+i);

9、 System.out.println(name+"Interrupered");

10、 System.out.println(name+" exiting.");

三、java中多线程的讲解及其应用

1、每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。

2、多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。

3、·使用线程可以把占据长时间的程序中的任务放到后台去处理

4、·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

5、·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。