如何实现线程的同步
程序员文章站
2024-03-01 18:15:16
...
在上面的一节中我们看到了是线程不同的不问题,那么对于这样的线程不同步,我们是可以利用上锁的方式来解决。同步表示的是线程不同时进入一段代码或者是一个方法,而是按照一定的顺序进入一个代码块。实现同步我们可以用同步代码块来解决,可以用不同方法来解决。
我们来看同步方法:
package com.epoint.wdgtest;
public class WdgTest
{
//用休眠来看程序的并发执行
public static void main(String [] args){
myThread mt1=new myThread();
new Thread(mt1,"线程1").start();
new Thread(mt1,"线程2").start();
new Thread(mt1,"线程3").start();
}
}
class myThread implements Runnable{
private int ticket=10;
public void run(){
for(int i=0;i<20;i++){
this.scale();
}
}
public synchronized void scale(){
if(this.ticket>=1){
try {
Thread.sleep(20);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"获取"+this.ticket--+"号");
}
}
}
最后的输出结果如下:
为了让线程的同步,我们可以对一些方法进行上锁,上锁也就类似于排队上厕所,当有一个人在厕所的时候,其他的线程只能在外面进行等待,因为前面的人已将在锁上的厕所的门,等里面的人出来,等着的线程才可以进入。上面的是通过对创建同步方法来实现同步,其实我们还可以利用同步代码块的方法来实现线程的同步:
package com.epoint.wdgtest;
public class WdgTest
{
//用休眠来看程序的并发执行
public static void main(String [] args){
myThread mt1=new myThread();
new Thread(mt1,"线程1").start();
new Thread(mt1,"线程2").start();
new Thread(mt1,"线程3").start();
}
}
class myThread implements Runnable{
private int ticket=10;
public void run(){
for(int i=0;i<20;i++){
synchronized (this) {
if(this.ticket>=1){
try {
Thread.sleep(20);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"获取"+this.ticket--+"号");
}
}
}
}
}
上面我们在方法的内部来对一段代码进行上锁来实现同步的功能,这个就是同步代码块。结果和同步方法输出的结果是一样的,也就是实现了我们想要的功能。
上一篇: 蒟蒻的瞎搞哈希