zoukankan      html  css  js  c++  java
  • 多线程,线程同步,synchronized关键字的用法

    一、什么是多线程

      Java多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。一般主要用前面两种方法。

      1、继承 Thread 方法 实现多线程

    //继承 Thread 方法
    public class MyThread extends Thread {  
      public void run() {  
       System.out.println("MyThread.run()");  
      }  
    }  
     
    MyThread myThread1 = new MyThread();  
    MyThread myThread2 = new MyThread();  
    myThread1.start();  
    myThread2.start();

      2、实现Runnable接口方法

     1 public class MyThread extends OtherClass implements Runnable {  
     2   public void run() {  
     3    System.out.println("MyThread.run()");  
     4   }  
     5 } 
     6 
     7 //调用
     8 MyThread myThread = new MyThread();  
     9 Thread thread = new Thread(myThread);  
    10 thread.start();  

    二、同步机制

    • 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别。
    • 线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低    线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制

    为何要使用同步? 
        java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 
        将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 
        从而保证了该变量的唯一性和准确性。

    三、synchronized关键字

           synchronized实现同步主要是同步块、同步方法实现。

      加上它作用就是在多线程访问时,自动加上锁,禁止别的线程访问,直到这个线程访问才解锁;

           可以防止多线程修改数据时造成访问数据不同步

      

    1.同步方法 
        即有synchronized关键字修饰的方法。 
        由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 
        内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。


        代码如: 
        public synchronized void save(){}

       注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类

    2.同步代码块 
        即有synchronized关键字修饰的语句。 
        被该关键字修饰的语句块会自动被加上内置锁,从而实现同步


        代码如: 
        synchronized(object){ 
        }

        注:同步是一种高开销的操作,因此应该尽量减少同步的内容。 
        通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。 

                 /**
                 * 用同步方法实现
                 * 
                 * @param money
                 */
                public synchronized void save(int money) {
                    account += money;
                }
             
        
    
                /**
                 * 用同步代码块实现
                 * 
                 * @param money
                 */
                public void save1(int money) {
                    synchronized (this) {
                        account += money;
                    }
                }       

      

  • 相关阅读:
    Python中if __name__ == '__main__':的作用
    Java集合面试题及答案总结(2020版)
    Java多线程面试题及答案(2020版)
    poi: 如何获取cell的行号对应的字母
    gogs: 进入Docker实例并修改MySQL帐号
    多音源多声卡背景音乐播放系统,可在一台电脑上同时播放10种音乐
    弱电图纸中敷设方式符号表示大全
    HashMap集合详解----源码分析--之--高级篇
    正则表达式总结及主要事项
    使用接口进行form表单提交
  • 原文地址:https://www.cnblogs.com/lemon-flm/p/7551932.html
Copyright © 2011-2022 走看看