侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

线程

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 99 阅读 / 3,019 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
锁上能不能直接调用await()方法???
sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。wait要在synchronized里才能用
https://www.jianshu.com/p/cc308d82cc71
java.util.concurrent包 (多线程并发库)
java.util.concurrent.lock 包 (多线程的锁机制)


yield() 屈服,放弃
synchronized 里的是wait()notify()

用锁创建的 condition里的是 await() signal()

这是两个体系,一个是synchronized体系,一个是condition体系

任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来看Object的wait和notify/notify是与对象监视器配合完成线程间的等待/通知机制,而Condition与Lock配合完成等待通知机制,前者是java底层级别的,后者是语言级别的,具有更高的可控制性和扩展性。两者除了在使用方式上不同外,在功能特性上还是有很多的不同:
1.
Condition能够支持不响应中断,而通过使用Object方式不支持;
2.
Condition能够支持多个等待队列(new 多个Condition对象),而Object方式只能支持一个;
3.
Condition能够支持超时时间的设置,而Object不支持
作者:你听___链接:
https://www.jianshu.com/p/28387056eeb4
原理
AQS自己维护的队列是当前等待资源的队列,AQS会在资源被释放后,依次唤醒队列中从前到后的所有节点,使他们对应的线程恢复执行。直到队列为空。
Condition自己也维护了一个队列,该队列的作用是维护一个等待signal信号的队列
两个队列的作用是不同,事实上,每个线程也仅仅会同时存在以上两个队列中的一个,因为await的时候回释放掉锁。


count++ 不是原子操作,多线程同时执行的话有可能取到相同的值然后同时相加,导致偏差1。

可重入锁:A线程申请由A线程持有的锁时,直接获取成功,计数加1,此时这个线程两次释放此锁才能被其它线程申请。例子:
public class father{
    public synchronized void doSomething(){}
}

public class son extends father{
public synchronized void doSomething(){
super.doSomething() //调用父方法时要再申请锁,此时即为重入,若不可重入就会死锁。
}
}



线程安全的容器只保证自己单个操作的原子性。
锁的共享?

优先级
线程未启动前设置,对于一执行到底无法抢占的线程无意义。
从1到10
默认是5
t1.getPriority();
t1.setPriority(Thread.NORM_PRIORITY);

对线程的操作
sleep(毫秒)
t.join()
这个是等到t线程执行完再执行这一句下面的代码。
t.setDaemon()
把这个线程设置成守护进程,当所有非守护进程执行完后虚拟机就会终止,此时程序执行完成。
t.interrupt()
设置中断状态,这个中断要靠自己实现,不会自动执行!!! 要在t线程里检测isInterrupted() 的值,然后自己中断。这就是一个状态值。
t.interrupted()
恢复中断状态。恢复当前线程而不是t
t.getName()
获取线程的名字,名字可以自己实例化线程是设置。
同步方法

3.公平锁
condition(算是lock的一个特性,是的能协调多个资源)
Lock lock = new ReentrantLock();
Condition A = lock.newCondition();
Condition B = lock.newCondition();
Condition C = lock.newCondition();
Condition D = lock.newCondition();

A.await() //阻塞当前线程,并表示在等待A 资源。
A.signal() //开始运行等待 A 资源的线程。

condition的操作要在获取锁之后。也就是要在同步代码块里
condition.await() 让当前线程阻塞,并监视condition
condition.signal() 唤醒监视当前condition的线程




volatile
修饰变量,只能保证变量的可见性,不能保证变量操作的原子性,即同时修改的话会有脏读问题。
使用场景:
1. 运算结果并不依赖当前值,或者能确保只能有单一线程修改变量的值。
2. 变量不需要与其它的状态变量共同参与不变约束。
volatile boolean shutdownRequested;
public void shutdown() {
    shutdownRequested = true;
}

public void doWork() {
    while (!shutdownRequested) { 
        //do stuff
    }
}</code></pre></div>            <div style="width: 100%; max-width: 996px; margin-top: 2px;">
            <div style="color: inherit; fill: inherit;">
                <div style="display: flex;">





0

评论区