Java线程(二)

今天重新整理关于concurrent包的使用。

Lock 接口, 提供了synchronized的功能, 同时额外增加复杂性,处理复杂问题的能力,因为在synchronized的时候,可以顺序的获取多个锁,同时也需要倒序的释放这些锁,碰到一些情况这个就不能满足了,这时候Lock就可以,

它实现了锁在不同作用范围的获取和释放,同时不同顺序的获取和释放

通常这样使用

Lock l = ...

l.lock();

try{

 

 

}finally{

 l.unlock();

}

没有了synchronized的自动释放锁的能力,手动做

Lock 的一些功能

一个非块结构的获取锁, tryLock()

获取可中断锁的尝试, tryInterruptibly()

获取超时失效锁的尝试, tryLock(Long, timeUnit);

重这3个方法中,看出来有三种获取锁的方式,可中断,不可中断,定时

 

 

ReadWriteLock 接口, 提供了多个线程同时访问共享资源的能力,它由一对读-写锁组成,读锁可以被多个线程共享,写只能独占,并且保证了数据的内存同步,写的结果在读中,即时可得。

它适用于,需要经常被读,但是写的较少的情况,简单说,就是读的时间长的

 

ReentrantLock 实现了Lock 的 可重入互斥锁, 具有synchronized语句访问隐式锁的相同的基本语义和行为,但更强大。它提供了很多的方法来检查当前锁的情况,包括当前线程是否拥有锁,isHeldByCurrentThread(), 等待的线程, getWaitingThreads(Condition), getQueuedThreads(), getHoldCount(), getOwner(), hasXXX, 等方法来查看是否有等待线程,等待的数量等。

它还提供了一个fair参数,来实现公平策略,即当多个线程竞争的时候,倾向于等待时间最长的线程,当然是不保证的,并且可能很慢。同时使用tryLock()方法是不管公平的,只要锁空闲,就可获取。

 

Condition 接口,与每个Lock相关,newCondition()创建, 在我看来Condition就是Object中wait,notify的升级版,Object中使用的隐式锁机制的wait,notify需要保持一个锁, Condition不需要, 同时Condition 可以提供唤醒的通知顺序控制,可以对一个锁有多个Condition。

 

 class BoundedBuffer {
   final Lock lock = new ReentrantLock();
   final Condition notFull  = lock.newCondition(); 
   final Condition notEmpty = lock.newCondition(); 

   final Object[] items = new Object[100];
   int putptr, takeptr, count;

   public void put(Object x) throws InterruptedException {
     lock.lock();
     try {
       while (count == items.length) 
         notFull.await();
       items[putptr] = x; 
       if (++putptr == items.length) putptr = 0;
       ++count;
       notEmpty.signal();
     } finally {
       lock.unlock();
     }
   }

   public Object take() throws InterruptedException {
     lock.lock();
     try {
       while (count == 0) 
         notEmpty.await();
       Object x = items[takeptr]; 
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } finally {
       lock.unlock();
     }
   } 
 }
 



 CountDownLatch

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

 

主要方法

 public CountDownLatch(int count);

 public void countDown();

 public void await() throws InterruptedException
 

构造方法参数指定了计数的次数

countDown方法,当前线程调用此方法,则计数减一

awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

### 如何在 Unity 中通过脚本动态调整材质透明度 为了实现在 Unity 中动态控制物体的透明度,可以采用如下方式: #### 创建带有透明度功能的 Shader 首先,在 Unity 编辑器内新建一个名为 `TransparencyShader` 的着色器文件。对于希望实现简单透明效果的情况,可以选择基于 Unlit 或者 Standard 表面着色器作为基础模板,并在此基础上加入 Alpha 通道的支持。 ```csharp // TransparencyShader.shader 文件内容示例 (Unlit 版本) Shader "Custom/TransparencyShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _AlphaValue ("Alpha Value", Range(0,1)) = 1.0 } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent"} Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag sampler2D _MainTex; float _AlphaValue; struct appdata_t { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 pos : SV_POSITION; }; v2f vert(appdata_t v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag(v2f i) : COLOR { fixed4 col = tex2D(_MainTex, i.uv); col.a *= _AlphaValue; // 控制最终颜色的alpha值 return col; } ENDCG } } } ``` 此段代码定义了一个简单的未照明(unlit)着色器,其中 `_AlphaValue` 属性用于接收外部传入的透明度数值[^2]。 #### 使用 C# 脚本来更改 Material 的属性 接着,可以通过编写一段 C# 脚本来访问并修改已分配给 GameObject 上渲染组件所使用的材质对象及其内部存储的颜色或纹理等资源。下面是一个例子展示了怎样利用此类方法去实时更新指定游戏对象表面材料的不透明程度。 ```csharp using UnityEngine; public class ChangeMaterialOpacity : MonoBehaviour { public Renderer objectRenderer; // 渲染器引用 private Material materialInstance; // 材质实例 void Start() { if(objectRenderer != null){ materialInstance = objectRenderer.material; }else Debug.LogError("请为该脚本设置有效的渲染器"); } /// <summary> /// 设置目标材质的新透明度 /// </summary> /// <param name="newOpacity">取值范围应在 [0,1]</param> public void SetNewOpacity(float newOpacity) { if(materialInstance.HasProperty("_AlphaValue")) { materialInstance.SetFloat("_AlphaValue", Mathf.Clamp(newOpacity, 0f, 1f)); } else { Debug.LogWarning("当前材质并不支持 '_AlphaValue' 参数."); } } } ``` 上述代码片段提供了一种机制,允许开发者通过调用 `SetNewOpacity()` 方法来自由设定任意合法范围内(即介于 0 和 1 之间)的目标透明级别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值