美文网首页
java 多线程1

java 多线程1

作者: vincky倩 | 来源:发表于2018-03-13 19:50 被阅读0次

线程为何要使用同步?

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

volatile只能解决多线程可见,不能解决线程安全问题。

Volatile关键字的作用是全局变量在多个线程之间可见。

Thread的几个重要方法

a、start()方法,调用该方法开始执行该线程;

b、stop()方法,调用该方法强制结束该线程执行;

c、join方法,调用该方法等待该线程结束。

d、sleep()方法,调用该方法该线程进入等待。

e、run()方法,调用该方法直接执行线程的run()方法,但是线程调用start()方法时也会运行run()方法,区别就是一个是由线程调度运行run()方法,一个是直接调用了线程中的run()方法!!

注意,wait()与notify()方法是Object的方法,不是Thread的方法!!同时,wait()与notify()会配合使用,分别表示线程挂起和线程恢复。

wait()与sleep()的区别

wait()会释放对象锁,释放cpu

sleep()不会释放对象锁,释放cpu。

线程使用同步的前提条件

1)必须要有两个或者两个以上的线程。

2)必须是多线程使用同一个锁。

3)必须保证只有一个线程在运行。

线程同步运行原理

1)有一个线程已经拿到了锁,其他线程已经有cpu执行的,一直在排队,等待其他线程释放锁。

2)锁是什么时候释放呢?代码执行完毕或者程序抛出异常都会释放锁。

3)锁释放后,其他线程开始获取锁进入同步代码。

关于线程同步简单说明:

1)在普通方法上面加上synchronized 即为同步函数

2)同步函数使用的this锁 (synchronized (this)==public synchronized void save(){}) 

3)静态同步函数不使用this锁

4)同步代码块 :有synchronized关键字修饰的语句块 (synchronized(object){ })。

关于Lock对象和synchronized关键字的选择:

a.最好两个都不用,使用一种java.util.concurrent包提供的机制, 能够帮助用户处理所有与锁相关的代码。

b.如果synchronized关键字能满足用户的需求,就用synchronized,因为它能简化代码

 c.如果需要更高级的功能,就用ReentrantLock类,此时要注意及时释放锁,否则会出现死锁,通常在finally代码释放锁

两个线程,一个线程使用同步函数,另一个线程使用静态同步函数能实现同步吗?

不能,同步函数使用的this锁,静态同步函数使用的当前字节码文件(xx.class)。

线程如何实现同步?

1)synchronized   自动加锁

class Bank {

private int account = 100;

public int getAccount() { return account; }

public synchronized void save(int money) {

account += money;

 }}

2)lock   手动加锁

ReentrantLock() : 创建一个ReentrantLock实例 lock() : 获得锁 unlock() : 释放锁

例如:

class Bank {

 private int account = 100;

 private Lock lock = new ReentrantLock(); //需要声明这个锁

public int getAccount() {

        return account;

 }

public void save(int money) {

       lock.lock();

try{

      account += money;

 }finally{

     lock.unlock();

 } } }

相关文章

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • (五) volatile关键字

    Java多线程目录 1 背景 理解Java多线程的内存抽象逻辑请阅读java多线程内存模型,当代操作系统,处理器为...

  • Java多线程高级特性(JDK8)

    [TOC] 一、Java多线程 1.Java多线程基础知识 Java 给多线程编程提供了内置的支持。一条线程指的是...

  • Java多线程的使用通信和控制

    Java多线程的使用通信和控制 1. Java多线程的使用和通信 实现多线程有两种方式 1. 继承Thread父类...

  • 带你搞懂Java多线程(五)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四) ...

  • Android中的多线程

    1. Java多线程基础 Java多线程,线程同步,线程通讯 2. Android常用线程 HandlerThre...

  • 带你搞懂Java多线程(六)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四)带...

  • java线程&和各种奇奇怪怪的锁

    1、Java线程 一、Java多线程常用的两种实现方法 1、 继承Thread类 子类继承Thread类具备多线程...

  • 10.3多线程详解

    Java高级-多线程 多线程创建 多线程通讯 线程池 1.多线程创建 thread/runnable图:继承Thr...

  • 2018-10-16

    Java编程思想 1~12 java多线程编程核心技术 23~57

网友评论

      本文标题:java 多线程1

      本文链接:https://www.haomeiwen.com/subject/fkxrfftx.html