Java多线程synchronized关键字
synchronized关键字代表着同步的意思,在Java中被synchronized修饰的有三种情况
1.同步代码块
//锁为obj
synchronized(obj){
while(true){
if(product > 0){
System.out.println(Thread.currentThread().getName()+"消费:"+product--);
}
}
}
2.同步函数
//锁为this
public synchronized void consume() {
while(true){
if(product > 0){
System.out.println(Thread.currentThread().getName()+"消费:"+product--);
}
}
}
3.静态同步函数
//锁为this.getClass()
static public synchronized void consume() {
while(true){
if(product > 0){
System.out.println(Thread.currentThread().getName()+"消费:"+product--);
}
}
}
死锁案例
1.同步嵌套
package threaddemo;
public class DeathLock {
public static void main(String[] args) {
Callable c1 = new Callable(true);
Callable c2 = new Callable(false);
Thread t1 = new Thread(c1);
Thread t2 = new Thread(c2);
t1.start();
/*try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
t2.start();
}
}
class MyLock {
static final public Object locka = new Object();
static final public Object lockb = new Object();
}
class Callable implements Runnable {
private boolean flag;
public Callable(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
if (flag) {
synchronized (MyLock.locka) {
System.out.println(name+":获取到了locka");
synchronized (MyLock.lockb) {
System.out.println(name+":获取到了lockb");
}
System.out.println(name+":释放了lockb");
}
System.out.println(name+":释放了locka");
} else {
synchronized (MyLock.lockb) {
System.out.println(name+":获取到了lockb");
synchronized (MyLock.locka) {
System.out.println(name+":获取到了locka");
}
System.out.println(name+":释放了locka");
}
System.out.println(name+":释放了lockb");
}
}
}
2.多生产者多消费者时只使用notify(),线程通讯死锁
解决办法采用notifyAll代替notify,唤醒所有线程就不会导致死锁
package threaddemo; /**
* 多生产者消费者线程通讯死锁
* @author wpy
*
*/
public class ProducerConsumerDeathLock {
public static void main(String[] args) {
Resource resource = new Resource(); Producer producer0 = new Producer(resource);
Producer producer1 = new Producer(resource); Consumer consumer2 = new Consumer(resource);
Consumer consumer3 = new Consumer(resource); Thread t0 = new Thread(producer0);
Thread t1 = new Thread(producer1);
Thread t2 = new Thread(consumer2);
Thread t3 = new Thread(consumer3); t0.start();
t1.start(); t2.start();
t3.start(); } } class Producer implements Runnable {
private Resource resource; public Producer(Resource resource) {
this.resource = resource;
} @Override
public void run() {
while (true) {
resource.set("资源");
}
}
} class Consumer implements Runnable {
private Resource resource; public Consumer(Resource resource) {
this.resource = resource;
} @Override
public void run() {
while (true) {
resource.out();
}
}
} class Resource {
private String name;
private int count = 1;
// 是否生成完毕
private boolean flag = false; public synchronized void set(String name) {
String threadName = Thread.currentThread().getName();
while (flag) {
try {
System.out.println(threadName+"进入等待状态");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(threadName+"取得执行权"); this.name = name + count;
count++;
System.out.println("生产者:" + this.name);
flag = true;
this.notify();
// this.notifyAll();
} public synchronized void out() {
String threadName = Thread.currentThread().getName();
while (!flag) {
try {
System.out.println(threadName+"进入等待状态");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(threadName+"取得执行权"); System.out.println("============消费者:" + name);
flag = false;
this.notify();
// this.notifyAll();
}
}
代码执行结果:
Thread-0取得执行权
生产者:资源1
Thread-0进入等待状态
Thread-1进入等待状态
Thread-3取得执行权
============消费者:资源1
Thread-3进入等待状态
Thread-2进入等待状态
Thread-0取得执行权
生产者:资源2
Thread-0进入等待状态
Thread-1进入等待状态
Java多线程synchronized关键字的更多相关文章
- Java 多线程 —— synchronized关键字
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java 多线程 - Synchronized关键字
目录 1-Synchronized 关键字概述 2- Synchronized关键字作用域 3- Synchronized 原理(反编译指令解释) 正文 1-Synchronized 关键字概述 由于 ...
- Java多线程-synchronized关键字
进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程 Ja ...
- java多线程 synchronized关键字的一些用法
看这篇文章啦: http://blog.csdn.net/xiao__gui/article/details/8188833
- Java的synchronized关键字:同步机制总结
JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程 ...
- Java 多线程 - synchronize 关键字
目录 Java 多线程 - synchronize 关键字 Java 多线程 - synchronize 关键字 学习自 http://cmsblogs.com/?p=2071 https://www ...
- java基础Synchronized关键字之对象锁
java中Synchronized关键字之对象锁 当有多个线程对一个共享数据进行操作时,需要注意多线程的安全问题. 多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同 ...
- java中synchronized关键字分析
今天我们来分析一下java中synchronized关键字.首先来看一段java代码:(本地编译环境为mac,jdk1.8的环境) Demo.java package com.example.spri ...
- Java基础-synchronized关键字的用法(转载)
synchronized--同步 顾名思义是用于同步互斥的作用的. 这里精简的记一下它的使用方法以及意义: 当synchronized修饰 this或者非静态方法或者是一个实例的时候,所同步的锁是加在 ...
随机推荐
- 基于SSM之Mybatis接口实现增删改查(CRUD)功能
国庆已过,要安心的学习了. SSM框架以前做过基本的了解,相比于ssh它更为优秀. 现基于JAVA应用程序用Mybatis接口简单的实现CRUD功能: 基本结构: (PS:其实这个就是用的Mapper ...
- tesseract-ocr字库训练图文讲解
第一步合成图片集 你需要把使用jTessBoxEditor工具把你的训练素材及多张图片合并成一张tif格式的图片集 第二步 生成box文件 运行tesseract命令,tesseract mjorc ...
- HDU1285 确定比赛名次
有N个比赛队(<=N<=),编号依次为1,,,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结 ...
- PL/SQL 三个小例子
/* SQL语句 员工集合:select to_char(hiredate,'yyyy') from emp --> 光标 --> 循环--> 退出条件:notfound 变量 co ...
- html阶段测试
1.简述src和href的区别? 2.在html页面的head中定义属性<meta http-equiv="X-UA-Compatible" content="IE ...
- Django扩展自定义manage命令
使用django开发,对python manage.py ***命令模式肯定不会陌生.比较常用的有runserver,migrate... 本文讲述如何自定义扩展manage命令. 1.源码分析 ma ...
- sphinx安装
相关命令及步骤 创建主索引: /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all ...
- “华尔街之狼”:ICO是“史上最大骗局”
勘探船进村的那个夏季,父亲从城里带回了那把手电.手电的金属外壳镀了镍,看上去和摸起来一样冰凉.父亲进城以前采了两筐枸杞子,他用它们换回了那把锃亮的东西.父亲一个人哼着<十八摸>上路,鲜红透 ...
- APP崩溃提示:This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
崩溃输出日志 2017-08-29 14:53:47.332368+0800 HuiDaiKe[2373:1135604] This application is modifying the auto ...
- 关于EF Code First模式不同建模方式对建表产生的影响
今天在学EF Code First模式的时候,发现几个很有趣的问题,问题如下: 1.当编写玩实体后,不指定任何主键约束,EF会找长的最像Id的,然后设置其为主键,验证代码如下: //User类 cla ...