一、使用synchronized实现同步代码块

格式:

        synchronized (对象 ){
        // 需要被同步的代码;
        }
实例:
class MyThread4 implements Runnable{private int ticket=100;Integer key=new Integer(10086);@Overridepublic void run() {while(true){synchronized(key){if(ticket>0){try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+":"+ticket);ticket--;}elsebreak;}}}}
public class ThreadTest4 {public static void main(String[] args) {MyThread4 myThread4 = new MyThread4();Thread th1 = new Thread(myThread4);Thread th2 = new Thread(myThread4);Thread th3 = new Thread(myThread4);th1.start();th2.start();th3.start();}
}

二、使用synchronized实现同步方法

格式:

        public synchronized void show (String name){
        ….
        }
实例:
class MyThread5 implements Runnable{private int ticket=100;@Overridepublic void run() {while(true){show();if(ticket<=0)break;}}private synchronized void show() {if(ticket>0){System.out.println(Thread.currentThread().getName()+":"+ticket);ticket--;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}
public class ThreadTest5 {public static void main(String[] args) {MyThread5 myt = new MyThread5();Thread th1=new Thread(myt);Thread th2=new Thread(myt);Thread th3=new Thread(myt);th1.start();th2.start();th3.start();}
}

注意:

1、使用synchronized关键字实现多线程同步的关键是保证其中synchronized(对象)中对象的一致;

2、其中同步方法中无static修饰的对象是当前对象本身(this),有static修饰的是类本身;

三、使用Loct手动实现同步

格式:

class A{
         private final ReentrantLock lock = new ReenTrantLock();
        public void m(){
        lock.lock();
        try{
        //保证线程安全的代码 ;
        }
        finally{
                lock.unlock();
                }

        }

}

实例:
import java.util.concurrent.locks.ReentrantLock;class MyThread10 implements Runnable{private int ticket=100;private ReentrantLock lock=new ReentrantLock();@Overridepublic void run() {while(true){try {lock.lock();if (ticket > 0) {System.out.println(Thread.currentThread().getName() + ":" + "售出第" + show()+ "张票成功");ticket--;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}} elsebreak;} finally {lock.unlock();}}}private int show(){return 101-ticket;}
}
public class ThreadTest10 {public static void main(String[] args) {MyThread10 meh=new MyThread10();Thread th1=new Thread(meh);Thread th2=new Thread(meh);Thread th3=new Thread(meh);th1.setName("窗口一");th2.setName("窗口二");th3.setName("窗口三");th1.start();th2.start();th3.start();}
}

JAVA--线程同步的三种方法相关推荐

  1. unix c线程同步的三种方法:互斥量、读写锁以及条件变-xhb8413-ChinaUnix博客

    unix c线程同步的三种方法:互斥量.读写锁以及条件变-xhb8413-ChinaUnix博客 unix c线程同步的三种方法:互斥量.读写锁以及条件变 2012-03-30 14:42:38 分类 ...

  2. java线程同步的7种方法

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

  3. 实现Java线程同步的五种方法

    线程同步概念 Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不明确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的 ...

  4. java线程同步的五种方法

    2019独角兽企业重金招聘Python工程师标准>>> 1.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, ...

  5. linux c 线程同步的三种方法

    目录 一.互斥锁(mutex) 二.条件变量(cond) 三.信号量(sem) 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用 ...

  6. Linux 线程同步的三种方法

    程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同 ...

  7. Linux C线程同步的三种方法

    void* thr_fn1() {printf ("111111"); }int main() {int err;pthread_t tid;void *tret;err = pt ...

  8. linux:线程同步的5种方法

    linux:线程同步的5种方法 一.为什么要使用线程: 二.线程同步的5种方法 2.1 互斥量 2.2 读写锁 2.3 条件变量 2.4 自旋锁 2.5 屏障 一.为什么要使用线程: <1> ...

  9. java多线程同步的四种方法_java中实现多线程的两种方法

    java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...

  10. Java线程同步的几种方式

    Java线程同步的几种方式 1.使用synchronized关键字  它的工作是对同步的代码加锁,使得每一次只能有一个线程进入同步块,从而保证线程间的安全性.  synchronized关键字的用法: ...

最新文章

  1. 【Android 逆向】Android 系统文件分析 ( 根目录下的目录和文件 | /data/ 应用和用户数据目录 | /mnt/ 挂载其它设备目录 )
  2. SpringMVC之Http标准的头部信息
  3. [?]Oracle 10g sqlplus 的Bug?
  4. HTTP一个 TCP 连接可以发多少个 HTTP 请求等面试题
  5. 【POJ - 3037】Skiing (Dijkstra算法)
  6. 华为联发科可以升级鸿蒙吗,华为鸿蒙系统降临!首批升级手机确定,联发科芯片被放弃?...
  7. Lc.exe已退出 代码为-1
  8. python初学者怎么入门-终于晓得python入门后怎么学精
  9. 编程学习记录1:编程的一些简单概念
  10. jwt token and shiro
  11. leetcode-337-打家劫舍三*
  12. u盘安全弹出有什么用?数据丢失还能恢复吗
  13. 支付宝企业转账到个人账号(php源码,亲测)
  14. 西工大java高级网络编程_西工大16春《JAVA高级网络编程》平时作业
  15. VMware vCenter Converter 物理机迁移
  16. hadoop入门6:hadoop查询两两之间有共同好友,及他俩的共同好友都是谁
  17. routeDone with a webviewId 12 that is not the current page(env: Windows,mp,1.06.2301040; lib: 2.30.0
  18. 最简单的单例模式,Go版本的实现你写对了吗?
  19. 利用计算机审计新闻,计算机审计显身手 审计员钻出账本堆被审单位麻烦减少...
  20. 一个08届毕业的学长写给即将毕业的09届的学弟学妹们

热门文章

  1. 微信小程序——获取openid
  2. Java中的数组利用键盘输入求平均数
  3. 最小生成树Prim算法java实现
  4. 神经网络(九)无监督学习
  5. scanf()函数的使用
  6. 室内定位技术:分类、方法与应用综述
  7. db2 replace函数的用法_48R软件数据的基本处理之删除重复数据(duplicated()、unique()、distinct()函数)...
  8. 机器学习--多层感知机、卷积神经网络、循环神经网络
  9. 管理学十二(流程与制度的重要性)
  10. Ubuntu(debian)问题解决方案合集