package cn.sasa.demo2;

import java.util.concurrent.ExecutionException;

public class ThreadDemo {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//创建Runnable接口实现类对象
Ticket t = new Ticket();
//创建3个Thread类对象,传递Runnable接口实现类
Thread t0 = new Thread(t);
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t); t0.start();
t1.start();
t2.start();
t3.start();
/**
* 线程安全问题一般发生在:
* 多线程并发访问同一个数据资源
*
* 通过线程休眠,出现了安全问题
*
* Thread-0 出售第 99
* Thread-1 出售第 98
* Thread-2 出售第 100
* Thread-3 出售第 97
* Thread-1 出售第 96
* Thread-0 出售第 96
* Thread-3 出售第 95
* Thread-2 出售第 94
* Thread-0 出售第 93
* Thread-1 出售第 92
* Thread-3 出售第 91
* Thread-2 出售第 91
* Thread-0 出售第 90
* Thread-1 出售第 90
* Thread-2 出售第 88
* Thread-3 出售第 89
* Thread-0 出售第 87
* Thread-1 出售第 87 ......
*
* 解决安全问题:
* 同步代码块
* synchronized(任意对象){
* 线程要操作的共享数据
* }
* 同步代码块中的锁对象可以是任意对象,
* 但多线程时,要使用同一个锁对象才能够保证线程安全性
*
* 同步方法 在方法声明上加入同步关键字
* eg :
* private synchronized void func(){
* ...
* }
* 同步方法中的对象锁,是本类对象引用 this
* 如果方法是静态的,锁是本类.class属性
*/ }
}
package cn.sasa.demo2;

public class Ticket implements Runnable {
//定义出售的票源
private int ticket = 100;
public static int sum = 100; public void run(){
int flag = 100;
while(flag > 0){
//buyTickets();
buy();
flag --;
}
} //同步方法 synchronized
private synchronized void buyTickets() {
if( ticket > 0){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 出售第 "+ticket--);
}
} private static synchronized void buy() {
if( sum > 0){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 还剩下。。。 "+sum--);
}
} }

java 线程(四)线程安全 同步方法的更多相关文章

  1. Java多线程(四) 线程池

    一个优秀的软件不会随意的创建.销毁线程,因为创建和销毁线程需要耗费大量的CPU时间以及需要和内存做出大量的交互.因此JDK5提出了使用线程池,让程序员把更多的精力放在业务逻辑上面,弱化对线程的开闭管理 ...

  2. Java多线程(四) —— 线程并发库之Atomic

    一.从原子操作开始 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始). 很多情况下 ...

  3. 重学JAVA基础(四):线程的创建与执行

    1.继承Thread public class TestThread extends Thread{ public void run(){ System.out.println(Thread.curr ...

  4. Java线程:线程的同步-同步方法

    Java线程:线程的同步-同步方法   线程的同步是保证多线程安全访问竞争资源的一种手段. 线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问 ...

  5. JAVA并发实现四(守护线程和线程阻塞)

    守护线程     Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台 ...

  6. 转:【Java并发编程】之四:守护线程与线程阻塞的四种情况

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17099981      守护线程   Java中有两类线程:User Thread(用户线 ...

  7. java多线程(四)-自定义线程池

    当我们使用 线程池的时候,可以使用 newCachedThreadPool()或者 newFixedThreadPool(int)等方法,其实我们深入到这些方法里面,就可以看到它们的是实现方式是这样的 ...

  8. Java进阶(四十三)线程与进程的区别

    Java进阶(四十三)线程与进程的区别 1.线程的基本概念   概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必 ...

  9. 【Java并发编程】:守护线程与线程阻塞的四种情况

    守护线程 JAVA中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程的运 ...

  10. 【Java并发编程】之四:守护线程与线程阻塞的四种情况

    守护线程 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) ​ 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台线程 ...

随机推荐

  1. 【emWin】例程三十一:窗口对象——Multipage

    简介: ULTIPAGE 类似于笔记本中的分隔卡或文件柜中的标签.通过使用MULTIPAGE 小工具,应用程序可为窗口或对话框的相同区域定义多个页面.每个页面包含特定 类型的信息或用户选择相应页面时应 ...

  2. STM32F103VET6 ADC采集64点做FFT变换

    http://www.stmcu.org/module/forum/thread-598459-1-11.html http://bbs.21ic.com/icview-589756-1-1.html ...

  3. opencv_java import org.opencv.highgui.Highgui,类中无imread方法

    opencv_java import org.opencv.highgui.Highgui,提示错误 2018年01月19日 14:50:25 小码农的路程 阅读数:358   原因:1.OpenCV ...

  4. Java知多少(15)字符串

    从表面上看,字符串就是双引号之间的数据,例如“微学苑”.“http://www.weixueyuan.net”等.在Java中,可以使用下面的方法定义字符串:    String stringName ...

  5. 设置Git用户信息

    $ git config --global user.name "leehongee" //给自己起个用户名 $ git config --globla user.email &q ...

  6. Java如何计数替换字符串中第一次出现的子字符串?

    在Java编程中,如何拆分正则表达式和字符串? 以下示例演示如何使用Matcher类的replaceFirst()方法替换字符中指定的子字符串的首次出现. package com.yiibai; im ...

  7. php中urlencode和urldecode的用法

    URLEncode:是指针对网页url中的中文字符的一种编码转化方式,最常见的就是Baidu.Google等搜索引擎中输入中文查询时候,生成经过Encode过的网页URL.URLEncode的方式一般 ...

  8. 09观察者模式ObServer

    一.什么是观察者模式 Observer模式是行为模式之一,它的作用是当 一个对象的状态发生变化时,能够自动通知其他 关联对象,自动刷新对象状态. Observer模式提供给关联对象一种同步通信的 手段 ...

  9. UILabel(富文本)

    本文转载至 http://www.jianshu.com/p/5d24d22f99c3 富文本 NSString *str = @"人生若只如初见,何事秋风悲画扇.\n等闲变却故人心,却道故 ...

  10. echarts - 使用echarts过程中遇到的问题(pending...)

    1. 配合tab切换时,被display:none的元素init设置echarts失败 2018-11-09  18:09:35 现象描述:有一个tabs选项卡,每个切换项A.B中都有使用echart ...