服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 浅析Java多线程同步synchronized

浅析Java多线程同步synchronized

2021-04-08 14:08彬菌 Java教程

本篇文章给大家详细分析了Java多线程同步synchronized的相关知识点,需要的读者们可以参考学习下。

单线程是安全的,因为线程只有一个,不存在多个线程抢夺同一个资源

代码例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SingleThread {
    int num=10;
    public void add(){
        while(num<13){
            num++;
            try{
                Thread.sleep(1000);
            }
            catch(Exception e){
                System.out.println("中断");
            }
            System.out.println(num);
        }
    }
    public static void main(String[] args){
        Thread thread = Thread.currentThread(); //获取当前运行的线程对象
        thread.setName("单线程"); //线程重命名
        System.out.println(thread.getName()+"正在运行");
        SingleThread st=new SingleThread();
        st.add();
    }
}

多线程安全,synchronized同步代码块

synchronized(对象){}; //同步代码块

synchronized 返回值 方法名(){}; //同步方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class One {
     int num=10;
     public void add(){
        synchronized(this){ //同步代码块,同步方法也可以实现效果synchronized void add(){};
        num++;
      try {
       Thread.sleep(1000);
      } catch (InterruptedException e) {
        System.out.println("中断");
      }
      System.out.println(num);
      }
     }
    }
    class Two implements Runnable{
     One one = new One();
     @Override
     public void run() {
         one.add(); //调用add方法
     }
    }
    public class Synch{
     public static void main(String[] args) {
        Two two = new Two();
      Thread t1 = new Thread(two); //创建三个子线程
      Thread t2 = new Thread(two);
      Thread t3 = new Thread(two);
      t1.start();
      t2.start();
      t3.start();
     }
}

注意:观察去除synchronized关键字的运行结果区别!

正常运行结果:

11
12
13

原文链接:https://www.idaobin.com/archives/839.html

延伸 · 阅读

精彩推荐