多线程,线程同步,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;
                }
            }       

  

原文地址:https://www.cnblogs.com/lemon-flm/p/7551932.html