线程与同步锁synchronized用法

简介
提到线程就要提到什么是进程
进程就是运行中的程序(不是很正式的说法,但也没错,注意一般情况下一个程序启动产生一个进程,也可能产生多个进程),是线程的集合,进程的资源一旦开辟就不能改变,只能共享。
进程状态
新的:进程正在被创建。
运行:指令正在被执行。
等待:进程等待某个事情的发生—必须等待事情的发生,没发生,cpu不能执行。
就绪:进程等待分配处理器—cpu主要有空闲就可以直接执行
终止:进程完成执行或由于异常强制退出。
那什么是线程呢?
线程是程序执行流的最小单位
简单说明如下:
一个任务就是一件事情,一件事情包含多个进程(多个动作),多个进程包含了多个线程(具体的操作)
什么是守护线程?
守护线程在没有用户线程可以服务时会自动离开,与用户线程“同生共死”
如GC垃圾回收器
守护线程具有最低的优先级
设置方式
thead.setDaemon(true);
什么是协层
是一种非抢占式的多任务程序
主要作用于遇到IO阻塞状态时,让其自行切换至其他可执行状态从而实现高并发
什么是线程协作
在同步代码块,去释放对象监视器。
线程的生命周期
新建状态:新创建了一个线程对象。

就绪状态:线程对象创建后,调用strat方法

运行状态:线程获取了cpu,执行程序代码

阻塞状态:阻塞状态是线程因为某种原因放弃cpu使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。 等待阻塞:运行的线程执行了wait方法,jvm会把该线程放入等待池中。同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

死亡状态:线程执行完了,或因异常退出了run方法,该线程结束生命周期。

线程的创建:

1.实现runnable接口
2.继承Thered类
3.创建内部类,如new There类重写run方法

//通过内部类创建线程,注意:main也是一个线程,我们称为主线程
public class Test{
      public static void main(String []args){
        new Thread(){
           for(int i=0;i<1000;i++){
              System.out.print("=====1====");
           }
        }.start();  
        new Thread(){
           for(int i=0;i<1000;i++){
              System.out.print("=====2====");
           }
        }.start();      
      }
   } 

线程的调度

优先级
t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MIN_PRIORITY);
Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级

线程加入
join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法, 则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。

线程睡眠
Thread.sleep(long millis) 使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。

线程等待
Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait(0) 一样

线程让步
Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程

线程唤醒
Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。直到当前的线程放弃此对象上的锁定,才能继续执行被 唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。

线程同步
研究线程同步就是研究线程与对象监视器之间的关系(同步锁),主要是为了解决多线程并发(临界资源所处的状态,就叫做并发。)问题,尤其是在争夺临界资源上(多个线程操作同一资源的,该资源就是临界资源),因为线程的异步性,可能导致抢临界资源出现越界行为,因此线程同步的主要任务是使并发执行的各线程之间能够有效的共享资源和相互合作,从而使程序的执行具有可再现性。

synchronized

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
用法
synchronized主要有几种方法

public class SynchronizedDemo {
     //同步方法
    public synchronized void doSth(){
        System.out.println("Hello World");
    }
 
 //修饰静态方法
   public synchronized static void method() {
     System.out.println("Hello World");
   }

    //同步代码块
    public void doSth1(){
        synchronized (SynchronizedDemo.class){
            System.out.println("Hello World");
        }
    }
}

修饰普通方法
一个对象中的加锁方法只允许一个线程访问。但要注意这种情况下锁的是访问该方法的实例对象, 如果多个线程不同对象访问该方法,则无法保证同步。

修饰静态方法
由于静态方法是类方法, 所以这种情况下锁的是包含这个方法的类,也就是类对象;这样如果多个线程不同对象访问该静态方法,也是可以保证同步的。

修饰代码块
其中普通代码块 如Synchronized(obj) 这里的obj 可以为类中的一个属性、也可以是当前的对象,它的同步效果和修饰普通方法一样;Synchronized方法 (obj.class)静态代码块它的同步效果和修饰静态方法类似。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值