JDK中Thread.State类的几种状态

线程的生命周期









线程的安全问题(同步与互斥)

方法一:同步代码块

多个线程的同步监视器(锁)必须的是同一把,任何一个类的对象都可以

      synchronized(同步监视器){

      }  //说明:操作共享数据的代码,即为需要被同步的代码(对共享数据的操作)

对于Thread实现和Runnable实现,同步锁需要区别

1.Thread下的同同步锁

class WinThread extends Thread{
/*
方式一 继承Thread
*/
private static int ticket=100; //需要设置静态变量
private static Object ticketLock=new Object(); //同步监视器,静态,因为要是共享唯一变量
@Override
public void run() {
while(true)
{
synchronized (ticketLock){
if (ticket > 0)
{
System.out.println(this.getName() + "卖票: " + ticket);
ticket--;
}
else break;
} }
}
}

2.Runnable下的同步锁

class winRunnable implements Runnable{
private int ticket=100; //不用设置成静态变量
private Object obj=new Object(); //声明一个对象为锁 @Override
public void run() {
while(true)
{
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(obj){ //互斥操作
if (ticket > 0)
{
System.out.println(Thread.currentThread().getName() + "卖票: " + ticket);
ticket--;
}
else break;
}
}
}
}

Thread下可以考虑用WinThread.class当锁,而Runnable下可以考虑用this当锁(总之要分析是不是同一个锁)

自己的坑:不能把共享的数据当作锁(例如WinThread下的int ticket改成Integer后当锁),这里还是会有问题

方法二:同步方法(代码略)

多声明一个对共享数据数据操作的方法,在方法的前面添加声明synchronized,而不是直接在run()前面加

1.同步方法中也涉及到同步锁,但锁是默认的

2.非静态的同步方法,锁是this

静态的同步方法,锁是当前类本身——xxx.class

 *              同步方法synchronized实现runnable接口
* private synchronized void 方法(){//普通同步方法的同步监视器是this
* //需要互斥的代码
* }
 *              同步方法synchronized实现继承Thread类
* 因为不同线程是Thread类的不同对象,所以一般要用静态
* private static synchronized void 方法(){//静态同步方法默认同步监视器是类本身
* //需要互斥的代码
* }

同步的局限性:操作同步代码时,只能有一个线程参与,其他线程等待,相当于互斥量为1

单例模式的同步问题

死锁问题

方法二:Lock(锁) ---JDK5.0新增

class LockRunnable implements Runnable{
private int ticket=100; //不用设置成静态变量
private ReentrantLock lock=new ReentrantLock(true); //true为选择FIFO的公平
@Override
public void run() {
while(true)
{
try { try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} lock.lock();
if (ticket > 0)
{
System.out.println(Thread.currentThread().getName() + "卖票: " + ticket);
ticket--;
}
else break;
}finally {
lock.unlock();
}
}
}
}

面试题:synchronized 与 Lock 的区别

相同:二者都可以解决线程安全问题

不同:synchronized机制在执行完相应的同步代码之后,自动的释放同步监视器

Lock需要手动的启动同步 .lock() ,同时结束同步也需要手动 .unlock()

Java多线程—线程同步(单信号量互斥)的更多相关文章

  1. Java多线程——线程同步

    在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...

  2. Java多线程 - 线程同步

    多线程操作同一个对象时,容易引发线程安全问题.为了解决线程安全问题,Java多线程引入了同步监视器. 同步代码块 同步代码块语法格式如下: synchronized(obj){ //此处的代码即为同步 ...

  3. JAVA多线程线程同步问题

    线程同步 在多线程的编程环境下,可能看着没有问题的代码在运行几千上万或者更多次后,出现了一些看着很奇怪的问题,出现这样的问题的原因就是可能会有两个或者更多个线程进入了同一块业务处理代码中导致了判断失效 ...

  4. Java中线程同步锁和互斥锁有啥区别?看完你还是一脸懵逼?

    首先不要钻概念牛角尖,这样没意义. 也许java语法层面包装成了sycnchronized或者明确的XXXLock,但是底层都是一样的.无非就是哪种写起来方便而已. 锁就是锁而已,避免多个线程对同一个 ...

  5. Java多线程:线程同步与关键字synchronized

    一.同步的特性1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blo ...

  6. Java多线程——线程之间的同步

    Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,如何使用volatile关键字,如何使用synchronized修饰的同步代码块和同步方法解决线程安全问题. 部分内容来自以 ...

  7. Java多线程-线程的同步(同步方法)

    线程的同步是保证多线程安全访问竞争资源的一种手段.线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些 ...

  8. Java多线程的同步控制记录

    Java多线程的同步控制记录 一.重入锁 重入锁完全可以代替 synchronized 关键字.在JDK 1.5 早期版本,重入锁的性能优于 synchronized.JDK 1.6 开始,对于 sy ...

  9. Java多线程——线程的创建方式

    Java多线程——线程的创建方式 摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态. 部分内容来自以下博客: https://www.cnblogs.com/dolph ...

随机推荐

  1. kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?

    Kafka 分布式的单位是 partition,同一个 partition 用一个 write ahead log 组织, 所以可以保证 FIFO 的顺序.不同 partition 之间不能保证顺序. ...

  2. 学习Redis(二)

    1.Redis应用场景 1.缓存(键过期时间) 1) 缓存session会话 2) 缓存用户信息,找不到再去mysql查,查到然后回写到redis 3) 商城优惠卷过期时间 2.排行榜(列表& ...

  3. http和https到底区别在哪

    一.Http和Https的基本概念 Http:超文本传输协议(Http,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.设计Http最初的目的是为了提供一 ...

  4. Netty学习摘记 —— 再谈ChannelHandler和ChannelPipeline

    本文参考 本篇文章是对<Netty In Action>一书第六章"ChannelHandler和ChannelPipeline",主要内容为ChannelHandle ...

  5. 一整套PCB设计流程和要点,老板再也不怕我出错!

    资料输入阶段 1. 在流程上接收到的资料是否齐全(包括:原理图.*.brd文件.料单.PCB设计说明以及PCB设计或更改要求.标准化要求说明.工艺设计说明文件) 2. 确认PCB模板是最新的 3. 确 ...

  6. JQuery基础修炼-样式篇

    jQuery对象转化成DOM对象 jQuery库本质上还是JavaScript代码,它只是对JavaScript语言进行包装处理,为了是提供更好更方便快捷的DOM处理与开发常见中经常使用的功能.我们可 ...

  7. vue2.0开发聊天程序(八) 初步完成

    项目地址 服务器源码地址:https://github.com/ermu592275254/chat-socket 网页源码地址:https://github.com/ermu592275254/ch ...

  8. 前端面试题整理——Javascript基础

    常见值类型: let a; //undefined let s = 'abc'; let n = 100; let b = true; let sb = Symbol('s'); let nn = N ...

  9. leetcode1753. 移除石子的最大得分

    题目描述: 你正在玩一个单人游戏,面前放置着大小分别为 a​​​​​​.b 和 c​​​​​​ 的 三堆 石子. 每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1 分.当存在 两个或 ...

  10. Checkstyle的安装与使用

    两种安装方法: 方法一: 1.Eclipse中,选择Help->Software Updates->Find and Install 2.选择 Search for new feature ...